JAVA正则表达式 API使用

import java.util.regex.*;

public class GroupTest
{
    public static void main(String[] args) throws Exception
    {
        Pattern p = Pattern.compile("(ca)(t)(s|b)");
        String str = "one cats,two catb in the yard";
        Matcher m = p.matcher(str);
        StringBuffer sb = new StringBuffer();
        boolean result = m.find();
        System.out.println("result:" + result);
        System.out.println("start:" + m.start());
        System.out.println("end:" + m.end());
        System.out.println("subStr:" + str.substring(m.start(), m.end()));
        System.out.println("group:" + m.group());
        System.out.println("该次查找获得匹配组的数量为:" + m.groupCount());
        for (int i = 1; i <= m.groupCount(); i++)
        {
            System.out.println(m.group(i));
        }

        result = m.find();
        System.out.println("result:" + result);
        System.out.println("start:" + m.start());
        System.out.println("end:" + m.end());
        System.out.println("subStr:" + str.substring(m.start(), m.end()));
        System.out.println("group:" + m.group());
        System.out.println("该次查找获得匹配组的数量为:" + m.groupCount());
        for (int i = 1; i <= m.groupCount(); i++)
        {
            System.out.println(m.group(i));
        }

        result = m.find();
        System.out.println("result:" + result);
        System.out.println("result:" + m.start());
        System.out.println("result:" + m.end());
        System.out.println("该次查找获得匹配组的数量为:" + m.groupCount());
        for (int i = 1; i <= m.groupCount(); i++)
        {
            System.out.println(m.group(i));
        }

    }
}

 

console:

 

result:true
start:4
end:8
subStr:cats
group:cats
该次查找获得匹配组的数量为:3
ca
t
s
result:true
start:13
end:17
subStr:catb
group:catb
该次查找获得匹配组的数量为:3
ca
t
b
result:false
Exception in thread "main" java.lang.IllegalStateException: No match available
    at java.util.regex.Matcher.start(Matcher.java:325)
    at GroupTest.main(GroupTest.java:37)

 

 

 

 

 

 

关于如何获取非匹配字符串:

 

import java.util.regex.*;

public class MatherTest
{
    public static void main(String[] args) throws Exception
    {
        // 生成Pattern对象并且编译一个简单的正则表达式"Kelvin"
        Pattern p = Pattern.compile("Kelvin");
        // 用Pattern类的matcher()方法生成一个Matcher对象
        Matcher m = p
                .matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company");
        StringBuffer sb = new StringBuffer();
        int i = 0;
        // 使用find()方法查找第一个匹配的对象
        boolean result = m.find();
        // 使用循环将句子里所有的kelvin找出并替换再将内容加到sb里
        while (result)
        {
            i++;
            m.appendReplacement(sb, "Kevin");
            System.out.println("第" + i + "次匹配后sb的内容是:" + sb);
            // 继续查找下一个匹配对象
            result = m.find();

        }

        // 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
        m.appendTail(sb);
        System.out.println("调用m.appendTail(sb)后sb的最终内容是:" + sb.toString());

    }
}

 

console:

 

第1次匹配后sb的内容是:Kevin
第2次匹配后sb的内容是:Kevin Li and Kevin
第3次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin
第4次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin
调用m.appendTail(sb)后sb的最终内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company

 

JS正则表达式:

 

JS中exec函数:

 

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值