java 捕获组与非捕获组
非捕获组:格式:(?:xxxx), 如:(?:aaa)\\w+(bbb)\\1,\\1 代表重复捕获的第一组即是(bbb)
public static void main(String[] args)
{
String str = "fooccccbarbarbarfo";
Pattern p = Pattern.compile("(?:foo)\\w+(bar)\\1\\1");
Matcher m =p.matcher(str);
if (m.find())
{
System.out.println(m.group());
System.out.println(m.group(1));
}
}
输出:
fooccccbarbarbar
bar
捕获组:格式:(xxx), 如:(aaa)\\w+(bbb)\\1,\\1 代表重复捕获的第一组即是(aaa) ,\\2代表(bbb)
public static void main(String[] args)
{
String str = "fooccccbarbarbarfo";
Pattern p = Pattern.compile("(foo)\\w+(bar)\\2\\2");
Matcher m =p.matcher(str);
if (m.find())
{
System.out.println(m.group());
System.out.println(m.group(1));
}
}
输出:
fooccccbarbarbar
foo
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。
属于贪婪模式的量词,也叫做匹配优先量词,包括:
“{m,n}”、“{m,}”、“?”、“*”和“+”。
在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:
“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。
对于贪婪模式,各种文档的叫法基本一致,但是对于非贪婪模式,有的叫懒惰模式或惰性模式,有的叫勉强模式,其实叫什么无所谓,只要掌握原理和用法,能够运用自如也就是了。个人习惯使用贪婪与非贪婪的叫法,所以文中都会使用这种叫法进行介绍。