正则表达式分组捕获说明
来源:互联网 发布:网络购票如何买下铺 编辑:程序博客网 时间:2024/06/11 17:01
分组语法 捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本
位置指定
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 这种类型的组不对正则表达式的处理产生任何影响,只是为了提供让人阅读注释
我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式,只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面。
位置指定
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们用于指定一个位置,就像\b,^,$那样,因此它们也被称为零宽断言。最好还是拿例子来说明吧:
(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\b。请仔细分析这个表达式,它可能不像你第一眼看出来的那么简单。
下面这个例子同时使用了前缀和后缀:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
负向位置指定
前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:
\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总是匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向位置指定能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b。
零宽负向先行断言(?!exp),只会匹配后缀exp不存在的位置。\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。
同理,我们可以用(?<!exp),零宽负向后行断言来查找前缀exp不存在的位置:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字(实验时发现错误?注意你的“区分大小写”先项是否选中)。
一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容。(<?(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。
更多详细参考:https://www.cnblogs.com/whaozl/p/5462865.html
- 正则表达式分组捕获说明
- 正则表达式捕获分组
- java 高级正则表达式 分组 捕获 引用
- 正则表达式 分组捕获(反向引用)
- 正则表达式 非捕获性分组
- 正则表达式高级用法(分组与捕获)
- 正则表达式-非捕获性分组
- javascript正则表达式分组-捕获性分组/非捕获性分组/正则前瞻
- JavaScript正则表达式分组模式:捕获性分组与非捕获性分组及前瞻
- 正则表达式之分组捕获、条件表达式、平衡组
- 正则表达式之分组捕获、条件表达式、平衡组
- 正则表达式之分组捕获、条件表达式、平衡组
- 正则表达式之分组捕获、条件表达式、平衡组
- 正则表达式之捕获型分组与非捕获型分组
- VB的正则表达式,不一样的分组捕获
- JAVA正则表达式高级用法(分组与捕获)
- JAVA正则表达式高级用法(分组与捕获)
- Java正则表达式——分组与捕获
- java反射机制浅析
- Python 正则表达式 匹配邮箱地址
- 原生JS、CSS3 上拉刷新效果的实现。
- 【tf系列2】参数说明
- 模块获取工具
- 正则表达式分组捕获说明
- 经典消费者生产者问题
- ArcGIS API for Javascript3.23加载高德地图
- 解决同一个页面不能跳转的问题
- Include and Exclude Test Methods in TestNG
- 《懒人Shell脚本》之十——统计多重路径下的不同扩展名文件及个数
- os模块有关
- 阿里云总裁胡晓明:AI泡沫过后,下一站是“产业AI”
- Recycleview添加item点击事件