强调在正则中只要单纯用了括号就会有捕获分组保存
来源:互联网 发布:python 运维框架 编辑:程序博客网 时间:2024/05/23 11:40
转载于:http://blog.csdn.net/marvel__dead/article/details/53365316
前言:
本篇文章主要为了强调正则中\1的引用,1为括号的编号。和不加不必要的括号,以防影响效率。
import java.util.regex.Matcher;import java.util.regex.Pattern;public class li14 { public static void main(String[] args) { String string="hello 123 hello"; String rex="(\\w+)\\s+(\\d+)\\s+(\\1)"; Pattern pattern=Pattern.compile(rex); Matcher matcher=pattern.matcher(string); if(matcher.find()){ System.out.println("匹配成功"); System.out.println("匹配编号0的匹配字符:["+matcher.group(0)+"]"); System.out.println("匹配编号1的匹配字符:["+matcher.group(1)+"]"); System.out.println("匹配编号2的匹配字符:["+matcher.group(2)+"]"); System.out.println("匹配编号3的匹配字符:["+matcher.group(3)+"]"); } }}
匹配编号0的匹配字符:[hello 123 hello]匹配编号1的匹配字符:[hello]匹配编号2的匹配字符:[123]匹配编号3的匹配字符:[hello]
例子2
import java.util.regex.Matcher;import java.util.regex.Pattern;public class li14 { public static void main(String[] args) { String string="hello 123 hello"; String rex="(\\w+)\\s+(\\d+)\\s+\\1"; Pattern pattern=Pattern.compile(rex); Matcher matcher=pattern.matcher(string); if(matcher.find()){ System.out.println("匹配成功"); System.out.println("匹配编号0的匹配字符:["+matcher.group(0)+"]"); System.out.println("匹配编号1的匹配字符:["+matcher.group(1)+"]"); System.out.println("匹配编号2的匹配字符:["+matcher.group(2)+"]"); // System.out.println("匹配编号3的匹配字符:["+matcher.group(3)+"]"); //如果把编号3放开就会报越界异常 } }}
运行结果:
匹配成功匹配编号0的匹配字符:[hello 123 hello]匹配编号1的匹配字符:[hello]匹配编号2的匹配字符:[123]
在上面这两个例子中,例子1的”//1”外面多加了括号所以,就多了捕获分组,并且保存了捕获分组结果。
然而加这个括号往往是多余的。因为//1已经可以正确表示第一个捕获分组的结果了。就不需要再多加个括号。
然而想要多加个括号也可以:
看例子:
import java.util.regex.Matcher;import java.util.regex.Pattern;public class li14 { public static void main(String[] args) { String string="hello 123 hello"; String rex="(\\w+)\\s+(\\d+)\\s+(?:\\1)"; Pattern pattern=Pattern.compile(rex); Matcher matcher=pattern.matcher(string); if(matcher.find()){ System.out.println("匹配成功"); System.out.println("匹配编号0的匹配字符:["+matcher.group(0)+"]"); System.out.println("匹配编号1的匹配字符:["+matcher.group(1)+"]"); System.out.println("匹配编号2的匹配字符:["+matcher.group(2)+"]"); // System.out.println("匹配编号3的匹配字符:["+matcher.group(3)+"]");//同样如果把编号3放开就会报越界异常 } }}
运行结果:
匹配成功匹配编号0的匹配字符:[hello 123 hello]匹配编号1的匹配字符:[hello]匹配编号2的匹配字符:[123]
总结,不用的括号一定要去掉,否者影响正则的匹配效率,因为括号会保存捕获分组,这样不仅耗费内存也耗费时间。
1 0
- 强调在正则中只要单纯用了括号就会有捕获分组保存
- 强调在正则中只要单纯用了括号就会有捕获分组保存
- 正则表达式捕获分组
- 正则取消括号分组
- perl正则命名分组捕获
- 正则表达式分组捕获说明
- 正则表达式非捕获型括号和捕获型括号
- 中括号在正则表达式中的多义性
- javascript正则表达式分组-捕获性分组/非捕获性分组/正则前瞻
- java 高级正则表达式 分组 捕获 引用
- 正则表达式 分组捕获(反向引用)
- 正则表达式 非捕获性分组
- 正则表达式高级用法(分组与捕获)
- 正则表达式-非捕获性分组
- [正则]正则表达式 捕获型括号和非捕获型括号
- JavaScript正则表达式分组模式:捕获性分组与非捕获性分组及前瞻
- 关于java正则表达式非捕获型括号和捕获型括号的研究
- 关于正则表达式——捕获型括号和非捕获型括号
- 适配器设计模式,简单的Java代码模拟
- Java定时器Timer类的使用
- boost—— 函数与回调bind
- windows 环境配置memcached
- 微信公众号开发day1
- 强调在正则中只要单纯用了括号就会有捕获分组保存
- C# 深入理解堆栈、堆在内存中的实现
- Java NIO
- 1、Linux kernel——获取源代码
- leetcode 62 C++. Unique Paths
- 【C#】40. 线程参数传递的三种方法
- 实现Windows数据绑定 上机练习
- Android PopupWindow使用总结
- 基于博创S3C6410l键盘驱动分析与更改