在本节开头,首先引出一个使用场景:
在一篇文章中,你想对由多个单词组成的整体进行匹配。即想对两个连续出现的单词,进行匹配。按照之前的思路,我们可能采用[/w]*
这种语法来尝试进行正则表达式的设计。
但由于之前提到的使用元字符以及常见的重复匹配的语法等,只能对单一的结构来进行匹配,当面临对一个复杂结构,里面包含各种字符,原有的元字符不能很好的进行匹配,这时候引出“组”的概念,也就是子表达式。
子表达式,也就是对表达式进行分组和归类,然后可以对其所构成的“组”,进行整体性操作。
子表达式
使用(
与)
来包裹子表达式。
正则表达式:
(10.10){2}
表示要匹配两个连续的10.10,其中{2}
表示重复两次,(
与)
包裹的子表达式表示要匹配的内容。
根据上图结果显示,在这段长字符串中,虽然也存在10.10,但是正则表达式并未进行匹配,只匹配到了两个连续的10.10,作为匹配结果。
子表达式的嵌套
子表达式允许进行嵌套,虽然使用子表达式后,正则表达式可能看起来晦涩难懂,但是只要按照对应的语法对正则表达式进行划分,也能很好的理解其想表达的意思。
在这里,对在编程中经常遇到的日期、时间类型,通过使用子表达式的方式来很好的进行展示。
首先使用多个子表达式对日期类型的匹配。
正则表达式:
(\d{4}/)(\d{2}/)(\d{2})
上面的表达式中,使用了三个子表达式。其中第一个子表达式表示,对重复出现4次的数字,以及符号/
进行匹配。第二个表达式表示,对重复出现2次的数字,以及符号/
进行匹配。第三个表达式表示,只对对重复出现2次的数字进行匹配。
根据上图结果显示,正则表达式匹配到了全文中以yyyy/mm/dd
格式的日期。
现在使用子表达式嵌套的方式,来对hh:mm:ss
的时间格式进行匹配。
正则表达式:
((\d{2}:){2}\d{2})
现在对上面设计的正则表达式进行拆解,由于要匹配的时间是hh:mm:ss
格式,在设计上,将hh:
作为子表达式,并将其进行两次重复匹配。转换成正则表达式,即(\d{2}:){2}
。
由于最后还剩下ss
未进行匹配,这里我们在刚才的正则表达式后,再添加\d{2}
表示要对整体的hh:mm:ss
格式进行匹配。最后再用(
与)
来包裹,组成一个新的子表达式,也就是((\d{2}:){2}\d{2})
。
根据上图结果显示,在全文中,设计的正则表达式匹配到了hh:mm:ss
格式的时间。
本节测试用例
cat
category
cat. X 10.9 Maverick
cat X 10.1010.10 Yosemite
cat1 X 10.10 Yosemite
cat2 X 10.10 Yosemite
Cat X 10.11 A Capita
category 10.12 Sierra
Category 10.13 Moj_
acat
<cat>A</cat>ads<cat>B</cat>
cat cat
1989-04-05
2000-02-14
Date 2023/03/21 10:20:23
Date 1937/02/23 09:21:34
「参考」
《正则表达式必知必会》