正则表达式中的分组组合与反向引用符
编程技术  /  houtizong 发布于 3年前   106
7.8 分组组合与反向引用符
分组组合符是将表达式中某部分内容组合起来的符号,反向引用符则是用于匹配分组组合捕获到的内容的标识符。
7.8.1 分组组合
(pattern)将pattern部分组合成一个可统一操作的组合项和子匹配,每个捕获的子匹配项按照出现的顺序存储在缓冲区中。缓冲区编号从1开始,最多可存储99个子匹配捕获的内容。存储在缓冲区中的子匹配捕获的内容,可以在编程语言中被检索,也可以在正则表达式中被反向引用。若要匹配字面意义的括号字符“(”和“)”,在正则表达式中要分别使用“\(”和“\)”。
7.8.2 反向引用
\num 匹配编号为num的缓冲区所保存的内容, num是标识特定缓冲区的一位或两位十进制正整数,这种方式称为子匹配的反向引用。反向引用能提供表示相同匹配项的能力。
例如,要匹配连续的3个数字字符,可以使用\d{3}作为正则表达式文本,可以匹配12345,但是要匹配连续的3个相同的数字字符,如3333、22222等,需要使用(\d)\1{2}作为正则表达式文本,\1表示与前面的(\d)所捕获的内容一致,\1{2}则表示前面的(\d)所捕获的内容还连续出现2次。
再如,要匹配“Is is the cost of of gasoline going up up?”中所有连续重复的单词部分,可使用/\b([a-z]+)\1\b/gi作为正则表达式文本,其中的[a-z]表示匹配a~z之间的任何一个字符,\b用于匹配单词的边界。
7.8.3 非捕获匹配
(?:pattern) 将pattern部分组合成一个可统一操作的组合项,但不把这部分内容当作子匹配捕获,即pattern部分是一个非捕获匹配,匹配的内容不存储在缓冲区中供以后使用。这对必须进行组合、但又不想让组合的部分具有子匹配特点的情况很有用。
例如,要将“xyz?”中的“xyz”组合起来,但并不想将匹配的内容保存在缓冲区中,应该使用“(?:xyz)?”,而不能使用“(abc)?”。又如,不能将“industry|industries”简单改写为“industry(ylies)”,若不需要引用或检索括号中的表达式所匹配的结果,最好还是写成“industry(?:ylies)”。
7.8.4 正向“预测先行”匹配
(?=pattern) 称为正向“预测先行”匹配,在被搜索字符串的相应位置,必须有pattern部分匹配的内容,但不作为匹配结果处理,更不会存储在捕获缓冲区中供以后使用。例如,“Windows (?=XP|2000)”只与“Windows 2000”或“Windows XP”中的“Windows”匹配,而不与“Windows 2003”中的“Windows”匹配。
注意
该模式下匹配的结果只是“Windows”部分,而使用“Windows (?:NT|2000)”匹配的是整个“Windows 2000”或“Windows NT”。如果要将 “NT”和“2000”前面的“Windows”替换成“Win”,需要使用“Windows (?=NT|2000)”,而不能使用“Windows (?:NT|2000)”,否则,整个“Windows 2000”或“Windows NT”将被替换成“Win”。
7.8.5 反向“预测先行”匹配
(?!pattern)称为反向“预测先行”匹配,在被搜索字符串的相应位置不能有pattern部分匹配的内容,此外,其功能与正向“预测先行”匹配一样。例如, “Windows (?!XP|2000)”不与“Windows 2000”或“Windows XP”中的“Windows”匹配,而可以与“Windows 2003”中的“Windows”匹配。
http://book.51cto.com/art/200804/68964.htm
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接