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。