JAVA正则表达式-捕获组与非捕获组
2015-08-06 13:44
459 查看
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>现在,如果我只想匹配到<textarea>内的文本内容即“nexus
maven repository index properties updating index central”,怎么做呢?这时候就要用到捕获组了。上述代码中“<textarea.*?>.*?</textarea>”最中间的“.*?”是匹配内容的正则表达式,只需要将它用括号括起来,就是一个捕获组了。
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的捕获组。
相关文章推荐
- Spring.Net学习笔记六(依赖对象的注入)
- JAVA反射机制
- java.lang.UnsupportedClassVersionError Bad version spring 框架异常,为JAVAEE配置1.7的jdk就行了。
- Java开发环境的配置
- Eclipse的安装
- win7 下面如何搭建Scala ——Eclipse开发环境
- dubbo 解决Multicast java.net.SocketException: No such device
- java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
- 【Java设计模式】· 职责链模式(Chain of Responsibility)
- java中的数组复制
- java 中的 & | ~ ^ 运算符分析
- spring 事务详解
- java项目转web项目
- Java检测端口的占用情况
- java泛型入门
- Java自定义注解基础知识
- java中关于十进制数左移,右移,无符号右移问题解决
- Dubbo java.io.IOException: Can not lock the registry cache file
- 很详细的:java中文数字转换成阿拉伯数字
- ServerSocket 、Socket 创建Java服务器与客户端以JSON格式聊天