正则表达式(\w*)ility表示匹配以ility结尾的词。第一个被捕获的部分是由\w*控制的。比如,输入的文本内容中有单词accessibility,那么首先被捕获的部分是accessib。如果输入的文本中有单独的ility,则首先被捕获的是一个空字符串。
你可能会有很多的捕获字符串,它们可能靠得很近。捕获组从左向右编号。也就是只需要对左括号计数。
假设有这样的正则表达式:(\w+) had a ((\w+) \w+)
输入的内容是:I had a nice day
捕获组1:I
捕获组2:nice day
捕获组3:nice
在一些正则表达式的实现中,你可以从零开始编号,编号零表示匹配整句话:I had a nice day.
在其他的实现中,如果没有制定捕获组,那么捕获组1会自动地填入捕获组0的信息。
是的,这也意味着会有很多的括号。有一些正则表达式的实现中,提供了“非捕获组”的语法,但是这样的语法并不是标准语法,因此我们不会介绍。
从一个成功的匹配中返回的捕获组个数,与使用原来的正则表达式获得的捕获组个数相同。记住这一点,你可以解释一些奇怪的现象。.
正则表达式((cat)|dog)表示匹配cat或者dog。这里有两个捕获组,如果输入文本是dog,那么捕获组1是dog,捕获组2为空。
正则表达式a(\w)*表示匹配一个以a开头的单词。这里只有一个捕获组
如果输入文本为a,捕获组1为空。
如果输入文本为ad,捕获组为d
如果输入文本为avocado,捕获组1为v。但是捕获组0表示整个单词avocado.
替换假如你使用了一个正则表达式去匹配字符串,你可以描述另外一个字符串来替换其中的匹配字符。用来替换的字符串称为替换表达式。它的功能类似于
常规的Replace会话
Java中的String.replace()函数
PHP的str_replace()函数
等等
练习将《时间机器》中所有的元音字母替换为r。
答案使用正则表达式[aeiou]以及[AEIOU],对应的替换字符串分别为r,R.
但是,你可以在替换表达式中引用捕获组。这是在替换表达式中,你可以唯一操作的地方。这也是非常有效的,因为这样你就不用重构你找到的字符串。
假设你正在尝试将美国风格的日期表示MM/DD/YY替换为ISO 8601日期表示YYYY-MM-DD
从正则表达式(\d\d)/(\d\d)/(\d\d)开始。注意,这其中有三个捕获组:月份,日期和两位的年份。
.捕获组的内容和捕获组编号之间用反斜杠分隔,因此你的替换表达式应该是20\3-\1-\2.
如果我们输入的文本中包含03/04/05表示2005年3月4日那么:
捕获组1:03
捕获组2:04
捕获组3:05
替换字符串2005-03-04.
在替换表达式中,你可以多次使用捕获组
对于双元音,正则表达式为([aeiou]),替换表达式为\l\l
在替换表达式中不能使用反斜杠。比如,你在计算机程序中希望使用字符串中使用部分文本。那么,你必须在每个双引号或者反斜杠之前加上反斜杠。
你的正则表达式可以是([\\"])。捕获组1是双引号或者反斜杠
你的替换表达式应该是\\\l
在某些实现中,采用美元符号$代替\
练习使用正则表达式和替换表达式,将23h59这样的时间戳转化为23:59.
答案正则表达式finds the timestamps, 替换表达式\1:\2
反向引用在一个正则表达式中,你也可以引用捕获组。这称作:反向引用
比如,[abc]{2}表示匹配aa或者ab或者ac或者ba或者bb或者bc或者ca或者cb或者cc.但是{[abc]}\1表示只匹配aa或者bb或者cc.
练习在字典中,找到包含两次重复子串的最长单词,比如papa, coco
\b(.{6,})\1\b 匹配 chiquichiqui.
如果我们不在乎单词的完整性,我们可以忽略单词的分解,使用正则表达式 (.{7,})\1匹配countercountermeasure 以及 countercountermeasures.
使用正则表达式编程特别提醒:
过度使用的反斜杠在一些编程语言,比如Java中,对于包含正则表达式的字符串没有特殊标记。字符串有着自己的过滤规则,这是优先于正则表达式规则的,这是频繁使用反斜杠的原因。
比如在Java中
匹配一个数字,使用的正则表达式从\d变为代码中的String re= “\\d”
匹配双引号字符串的正则表达式从"[^"]*" 变为String re = “\”[^\"]*\”"
匹配反斜杠或者是左边方括号,或者右边方括号的正则表达式从[\\\[\]] 变为String re = “[\\\\\
\[\\]<script type='math/tex; mode=display'>\</script>
String re = "\\s"; 和String re = "[ \t\r\n]"; 是等价的. 注意它们实际执行调用时的层次不同。
在其他的编程语言中,正则表达式是由特殊标明的,比如使用/。下面是JavaScript的例子:
匹配一个数字,\d会简单写成 var regExp = /\d/;.
匹配一个反斜杠或者一个左边的方括号或者一个右边的方括号, var regExp = /[\\\[\]]/;
var regExp = /\s/; 和 var regExp = /[ \t\r\n]/; 是等价的
当然,这意味着在使用/时必须重复两次。比如找到URL必须使用var regExp = /https?:\/\//;.
我希望现在你能明白,我为什么让你特别注意反斜杠。
动态正则表达式