`

捕获组和非捕获组

 
阅读更多
Java捕获组与非捕获组的区别

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()); 
        } 
    } 
 


运行结果:

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


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

上述代码中“<textarea.*>.*</textarea>”最中间的“.*”是匹配内容的正则表达式,只需要将它用括号括起来,就是一个捕获组了。看代码:

Java代码 
 
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>) 
        } 
    } 


运行结果:

Java代码 
<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代表整个匹配到的内容。
至于非捕获组,只需要将捕获组中"()"变为"(?:)"即可,代码说话:

 
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)); // (.*?) 
        } 
    } 

运行结果:
Java代码 
<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的捕获组。

捕获组是对整个表达式进行匹配的,例如:
public class Test {

public static void main(String args[]) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea><textarea

rows=\"20\" cols=\"70\">kkkk</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">kkkk</textarea>
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea><textarea rows="20" cols="70">
kkkk
</textarea>
分享到:
评论

相关推荐

    正则表达式之捕获组/非捕获组介绍

    正则表达式是处理字符串的强大工具,尤其...综上所述,正则表达式中的捕获组和非捕获组为我们提供了强大的模式匹配和文本处理能力。通过对它们的理解和应用,可以极大地提高我们在处理字符串相关任务时的效率和准确性。

    PHP之正则表达式捕获组与非捕获组(详解)

    与捕获组和非捕获组不同,预查不会消耗字符,也就是说,它们是零宽度的断言。 在PHP的正则表达式中,预查和预查可以使用"?"来简化书写,它们不会影响匹配过程中的字符计数,仅仅是对匹配条件进行额外的判断。例如,...

    PHP正则表达式之捕获组与非捕获组

    在实际应用中,捕获组和非捕获组的使用可以帮助我们精确地匹配复杂模式,提高数据处理的灵活性。通过合理运用这些技术,我们可以处理各种字符串匹配和提取的场景,使得数据处理工作变得高效而准确。

    浅谈PHP正则中的捕获组与非捕获组

    命名捕获组和非捕获组为正则表达式的书写和理解提供了便利,而反向引用则增强了字符串替换时的灵活性和表达能力。掌握这些知识能帮助开发者更加高效地处理字符串,编写出更加清晰和健壮的代码。

    java正则表达式之非捕获组

    感觉JDK这块不好理解,写了几个例子。求拍求回复。

    正则表达式的学习源码

    例如,创建一个正则表达式,包含捕获组和非捕获组,使用贪婪或非贪婪匹配,以及应用或关系和零宽度断言进行文本匹配和提取。通过实例化`Pattern`对象,调用`matcher(String input)`方法,然后使用`matches()`, `find...

    RegExp_lastParen.rar_in

    JavaScript 1.2的`lastParen`特性虽然在现代JavaScript版本中已经被更强大的特性所替代,如命名捕获组和非捕获组等,但对于了解JavaScript的历史和演进过程,以及在处理早期版本的代码时,理解`lastParen`仍然是非常...

    正则基础之——捕获组(capture group).rar

    4. **非捕获组**:有时我们希望分组但并不需要保存匹配的结果,这时可以使用非捕获组 `(?:...)`。这种情况下,分组仅用于逻辑运算,不会被当作捕获组对待。 5. **反向引用**:在某些正则表达式引擎中,可以使用反向...

    Qt捕获组合按键实现

    qt的键盘事件不能捕获多个按键按下.即便是在使用modifiers()时,也只能获得类似于shfit+x,ctrl+c,alt+y等等之类的快捷键,对于shift+x+c诸如此类更多的组合就无能为力的.本案例中提供了一种捕获shift+a+b...组合键的...

    Java正则表达式

    ORO库支持Perl风格的正则表达式,包括后向引用、捕获组和非捕获组等功能。 4. **使用Jakarta ORO**:在Java中使用Jakarta ORO,首先需要导入相关依赖,然后可以创建`OroPattern`对象来编译正则表达式,接着使用`...

    c#正则表达示 获取多个子匹配文本

    四、捕获组和非捕获组 1. 捕获组:使用圆括号`()`定义,可以捕获子匹配。例如`(\d+)\s+(\w+)`会捕获两组数字和单词。 2. 非捕获组:使用`(?:)`定义,不创建捕获组,仅用于分组。例如`(\d+)(?:\s+(\w+))`将数字和单词...

    正则文本数据提取器(2)-可记录历史表达式

    7. **捕获组和非捕获组**:通过括号定义捕获组,可以单独引用和处理匹配的部分,`(?:)`定义非捕获组,不保存匹配结果。 8. **反向引用**:在替换字符串中,可以通过`\1`, `\2`等引用捕获组的内容。 9. **正向前瞻...

    正则表达式测试工具

    6. **捕获组和非捕获组**:RegexPal允许用户创建捕获组(())以提取匹配的子串,以及非捕获组((?:))来组织模式而不会影响捕获。 7. **回溯控制**:通过使用反向引用(\n)和零宽断言(如^、$、\b、\B、(?=...)、...

    .NET的正则表达式总结

    4. **捕获组和非捕获组** - **捕获组**:用括号`()`定义的子表达式,可以捕获匹配的子串,如`(abc)`。 - **非捕获组**:使用`(?:...)`来定义的子表达式,不捕获匹配的子串,仅用于模式匹配。 5. **预定义字符类**...

    正则提取_C#_正则_正则提取_

    3. **捕获组和非捕获组** 在正则表达式中,圆括号用于创建捕获组,捕获组能够保留匹配的部分,方便后续引用。例如,`(http|https)`就是一个捕获组,可以捕获'http'或'https'。而如果我们只想匹配这部分但并不保存,...

    C# Regex 的几种写法 文档

    5. **捕获组和非捕获组**: - `(pattern)`创建一个捕获组,允许你引用匹配到的内容。 - `(?:pattern)`创建一个非捕获组,不保存匹配结果,仅用于组合其他模式。 6. **正向预查和反向预查**: - `(?=pattern)`...

Global site tag (gtag.js) - Google Analytics