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. vs下手敲git命令补遗

    大多数常用的点按钮就行了.少数还是手敲方便 ng new myapp   的时候已经新建git了,不过只有master分支. 创建新分支可以点vs左下角分支名字,然后在上方弹出的命令行里写名字,不过鼠 ...

  2. Anagram 由颠倒字母顺序而构成的字

    2018-07-15 19:23:08 Valid Anagram 问题描述: 问题描述: 可以使用map来记录各个字符出现的个数,在O(n)的时间复杂度内完成,当然也可以使用排序算法在O(nlogn ...

  3. English trip -- Phonics 6 元音字母 u + Unit 5 B课 review

    Vowel  u [ʌ]  闭音节 bunny cut bug mushroom lunch ar er ur or ir = R (读音类似儿) e.g. dollar  美元 collar  n. ...

  4. codeforces 930b//Game with String// Codeforces Round #468 (Div. 1)

    题意:一个串,右循环移位后,告诉你第一个字母,还能告诉你一个,问你能确定移位后的串的概率. 用map记录每个字母出现的位置.对于每个字母,用arr[j][k]记录它的所有出现位置的后j位是字母k的个数 ...

  5. Python下图片的高斯模糊化的优化

    资源下载 #本文PDF版下载 Python下图片的高斯模糊化的优化(或者单击我博客园右上角的github小标,找到lab102的W6目录下即可) #本文代码下载 高斯模糊(一维)优化代码(和本文方法集 ...

  6. 51nod-1534-博弈

    1534 棋子游戏  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们 ...

  7. $LANG、$NLS_LANG 记录一下

    环境:linux $LANG 为linux termal终端环境下的 语言环境 $NLS_LANG  为oracle数据库中 会话中的语言环境. 个人理解,望大家补充

  8. 自定义DateTimeInput(时间)控件的显示格式

    DateTimeInput控件已有的几种格式可以在Format属性中选择: 但这几种格式仍无法满足我的要求怎么办? 例如想将显示格式定为类似这样的格式:2010-06-11 20:02:52,两步搞定 ...

  9. 破解VS

  10. dp练习(10)——拦截导弹

    1044 拦截导弹 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...