55分钟学会正则表达式(来自Github)(5)

正则表达式(\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?:\/\//;.

我希望现在你能明白,我为什么让你特别注意反斜杠。

动态正则表达式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypdpg.html