分组的概念:用()括起来的就叫一个组
分组的作用:按组获取匹配的字符串
例子:从字符串 "我好有钱,银行存款123¥"中分别截取出123、¥
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class CapturingGroups {
- public static void main(String[] args) {
- //分组的概念
- CapturingGroups.testRegGroup("(\\d+)([¥$])","我好有钱,银行存款123¥");
- }
- public static void testRegGroup(String reg,String resource) {
- Pattern p = Pattern.compile(reg);
- Matcher m = p.matcher(resource);
- System.out.println("()表示一组:m.groupCount: " + m.groupCount());
- while(m.find()) {
- System.out.println("group(0)==group()表示整体匹配,value=" + m.group(0));
- for(int i=1; i<=m.groupCount(); i++) {
- System.out.print("m.group("+i+")=" + m.group(i) + ",");
- }
- System.out.println();
- }
- }
- }
输出:
- ()表示一组:m.groupCount: 2
- group(0)==group()表示整体匹配,value=123¥
- m.group(1)=123,m.group(2)=¥,
非捕获组:不用于捕获数据的组,那有啥用呢?看例子
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- * 正则表达式非捕获组
- * 特殊构造(非捕获) (JDK API说明)
- * 1.(?:X) X,作为非捕获组
- * 2.(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off
- * 3.(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
- * 4.(?=X) X,通过零宽度的正 lookahead
- * 5.(?!X) X,通过零宽度的负 lookahead
- * 6.(?<=X) X,通过零宽度的正 lookbehind
- * 7.(?<!X) X,通过零宽度的负 lookbehind
- * 8.(?>X) X,作为独立的非捕获组
- *
- */
- public class NonCapturingGroups {
- public static void main(String args[]) {
- //1.(?:)不记录组号
- NonCapturingGroups.testRegExp("(\\d+)(\\.?)(\\d+)([¥$])$","123.43$",new int[]{1,4});
- NonCapturingGroups.testRegExp("(\\d+)(?:\\.?)(?:\\d+)([¥$])$",2});
- //2.3 用于标志匹配,比如:(?i) 打开不区分大小写开关;(?-i) 关闭标志,恢复不区分大小写
- // 正则可改写成:(?i:abc)def 或者 (?i)abc(?-i:def)
- // 没有(?-1)时,没有关闭,可匹配AbcDef
- // NonCapturingGroups.testRegExp("(?i)abc(?-i)def","Abcdef");
- //4.5 !为=取反
- //(?=) 在前面,输出ba,4--6. 表示以b开头,结果集中包含b
- // 试试(?=b)a,永远无输出 再试下(?=b)b a(?=b),观察输出,自己分析下!!!!!!!!
- // NonCapturingGroups.testRegExp("(?=b).{2}","aacabaaqq");
- //(?=) 在后面,输出ac,2--4. 表示以2字符后面紧跟b,不捕获b
- // NonCapturingGroups.testRegExp(".{2}(?=b)","aacabaaqq");
- // NonCapturingGroups.testRegExp(".{2}(?=b).{2}","aacabaaqq");
- //6.7
- // lookahead: 前面紧跟 ; lookbehind: 后面紧跟
- // NonCapturingGroups.testRegExp(".{2}(?=b)","aacabaaqq");
- // NonCapturingGroups.testRegExp(".{2}(?<=b)","aacabaaqq"); //获取b前紧跟2字符
- // NonCapturingGroups.testRegExp(".{2}(?<=b).{2}","aacabaaqq"); // 获取b后紧跟2字符
- //8.(?>) 匹配失败,跳过
- // NonCapturingGroups.testRegExp("a(bc|b)c","abc");
- // NonCapturingGroups.testRegExp("a(?>bc|b)c","abc");
- }
- /**
- * @param regExp: 正则表达式
- * @param resource: 源字符串
- */
- public static void testRegExp(String regExp,String resource) {
- Pattern p = Pattern.compile(regExp);
- Matcher m = p.matcher(resource);
- int count = 0;
- while(m.find()) {
- count ++;
- System.out.println(m.group());
- System.out.println(m.start() + "---" + m.end());
- }
- if(count == 0)
- System.out.println("not find");
- }
- /**
- * @param regExp: 正则表达式
- * @param resource: 源字符串
- * @param groups: 输出组号
- */
- public static void testRegExp(String regExp,String resource,int[] groups) {
- Pattern p = Pattern.compile(regExp);
- Matcher m = p.matcher(resource);
- while(m.find()) {
- if(null == groups)
- groups = new int[]{0};
- for(int i=0; i<groups.length; i++) {
- System.out.print(m.group(groups[i]) + " ");
- }
- System.out.println();
- }
- }
- }
非捕获组细节比较多,对照代码输出,分析下就清楚了。占不清楚应用场景。
参考:http://blog.csdn.net/chunlin304/article/details/7238905
http://www.jb51.cc/article/p-tnmqccyo-vp.html