Java捕获组与非捕获组的问题

先看例子:

 import java.util.regex.Matcher;
import java.util.regex.Pattern; public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
String reg = "<textarea.*?>.*?</textarea>";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group());
}
} }

运行结果:

<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea> 

现在,如果我只想匹配到内的文本内容即“nexus maven repository index properties updating index central”,怎么做呢?这时候就要用到捕获组了。上述代码中“

 import java.util.regex.Matcher;
import java.util.regex.Pattern; public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
//下面的正则表达式中共有四个捕获组:(<textarea.*?>)、(.*?)、(</textarea>)和整个匹配到的内容
String reg = "(<textarea.*?>)(.*?)(</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (<textarea.*?>)
System.out.println(m.group(2)); // (.*?)
System.out.println(m.group(3)); // (</textarea>)
}
}
}

运行结果:

 <textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
<textarea rows="20" cols="70">
nexus maven repository index properties updating index central
</textarea>

从上述代码得出结论:正则表达式中每个”()”内的部分算作一个捕获组,每个捕获组都有一个编号,从1,2…,编号0代表整个匹配到的内容。
  

至于非捕获组,只需要将捕获组中”()”变为”(?:)”即可,代码说话:

 import java.util.regex.Matcher;
import java.util.regex.Pattern; public class PatternTest { public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
// 下面的正则表达式中共有二个捕获组:(.*?)和整个匹配到的内容,两个非捕获组:(?:</textarea>)和(?:<textarea.*?>)
String reg = "(?:<textarea.*?>)(.*?)(?:</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (.*?)
}
}
}

运行结果:

 <textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
nexus maven repository index properties updating index central

如果试图运行:System.out.println(m.group(2));将会抛出异常,因为不存在编号为2的捕获组。

  

还有方便的写法 (<textarea.*?>)(?<data>.*?)(</textarea>) 在正则表达式中加一个变量 data 然后在 group 获取 string str = m.group(“data”);

.*? 在这里是非贪婪模式,即最短匹配,比如说字符串 aabab,什么都不加,默认贪婪模式,a.*b 能匹配abab,非贪婪模式,加?号,a.*?b能匹配aab和ab;

JAVA正则表达式-捕获组与非捕获组的更多相关文章

  1. php 正则表达式捕获组与非捕获组

    熟练掌握正则表达式是每个程序员的基础要求,对于每个初学者来说会被正则表达式一连串字符弄得头晕眼花.博主便会如此,一直对正则表达式有种莫名的恐惧.近来看到另一位博友写的 <php正则表达式> ...

  2. JavaScript正则表达式模式匹配(4)——使用exec返回数组、捕获性分组和非捕获性分组、嵌套分组

    使用exec返回数组 var pattern=/^[a-z]+\s[0-9]{4}$/; var str='google 2012'; alert(pattern.exec(str)); //返回一个 ...

  3. split与re.split/捕获分组和非捕获分组/startswith和endswith和fnmatch/finditer 笔记

    split()对字符串进行划分: >>> a = 'a b c d' >>> a.split(' ') ['a', 'b', 'c', 'd'] 复杂一些可以使用r ...

  4. java 捕获组与非捕获组

    非捕获组:格式:(?:xxxx), 如:(?:aaa)\\w+(bbb)\\1,\\1 代表重复捕获的第一组即是(bbb) public static void main(String[] args) ...

  5. PHP正则中的捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可 ...

  6. js 正则表达式,分组,非捕获或 环视的使用

    定位一个字符串中,匹配与定位重复字符中的最后一个字符: 例子: <script type="text/javascript"> var str="http:/ ...

  7. java 正则表达式获取匹配和非获取匹配

    package test1; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestExp ...

  8. Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异

    转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...

  9. java正则表达式应用--验证字符串是否为数字(转载)

    首先说一下java正则表达式的重点概念: 第一.相关类:Pattern.Matcher 第二.典型的调用顺序是 Pattern p = Pattern.compile("a*b") ...

随机推荐

  1. 《剑指offer》第四十题(最小的k个数)

    // 面试题40:最小的k个数 // 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8 // 这8个数字,则最小的4个数字是1.2.3.4. #include < ...

  2. LeetCode--204--计数质数

    问题描述: 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 方法1:经典的判断是否为质数遍历( ...

  3. bzoj2154: Crash的数字表格 莫比乌斯反演

    题意:求\(\sum_{i=1}^n \sum_{j=1}^m\frac{i*j}{gcd(i,j)}\) 题解:\(ans=\sum_{i=1}^n\sum_{j=1}^m \frac{i*j}{g ...

  4. JS冒泡排序的6种写法(武当雄风)

    天下英雄出我辈,一入江湖岁月催.鸿图霸业谈笑间,不胜人生一场醉. 武当山上,一年一度的试道大会又开始了... 众武当弟子摩拳擦掌都想在此次试道大会上一展风采... 张三丰临终前曾留下一句话:试道大会采 ...

  5. 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

    1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...

  6. ubuntu下没有Language Support

    sudo apt-get installlanguage-selector-gnome

  7. Oracle12c 中RAC功能增强新特性之ASM&amp;Grid

    1.    自动存储管理(ASM)方面的增强 1.1.   Flex ASM 在典型的网格架构安装中,每个节点有自己的ASM实例运行并扮演该节点上数据库的存储容器的角色,对这种安装配置,存在单点失败的 ...

  8. ES profile 性能优化用——返回各个shard的耗时

    Profile API 都说要致富先修路,要调优当然需要先监控啦,elasticsearch在很多层面都提供了stats方便你来监控调优,但是还不够,其实很多情况下查询速度慢很大一部分原因是糟糕的查询 ...

  9. sublime text 2 php 语法错误检查

    使用sublime text 2 编写php程序的时候,保存代码的时候,直接检查出语法错误,有利于提高效率. 1.安装sublime text 2 package menu : preferences ...

  10. PHP:第二章——PHP中的equire与incude语句

    <?php header("Content-Type:text/html;charset=utf-8"); /* include: include_once//include ...