简单理解正则里的递归匹配

wils
wils

创作者俱乐部成员

WPS新的正则公式支持递归匹配,只是相关的介绍较少,看完这个就能简单上手:

首先,你肯定知道\1是反向引用,'(\d+).*\1'可以匹配'123a123'很好理解,第一个分组的匹配结果,注意这里是匹配的结果,它出现在后面可以用\1引用

然后,记住(?1)这个写法是引用分组1本身,注意区分,这里是分组本身,所以'(\d+).*(?1)'可以匹配'123a456',相当于前面的(\d+)再写一次,这也很好理解

那么,如果(?1)写在第一个分组内部会怎样?对,这就是递归了,想一想多层嵌套括号的结构,内部可不就是和外部一层层递归的结构嘛,到这里已经上手了

另外,(?R)是匹配整个正则本身,简单理解就是把整个正则当成一个分组,那么(?R)就表示这整个分组本身,而(?R)本来就包含再正则以内,所以就递归了

最常见的例子就是匹配正常的括号:

比如,从 ')(a(b(d))))((c)((' 这里,找出所有正确的括号结构,两种写法都可行:

'(\(\w(?1)?\))'

'\(\w(?R)?\)'

如果需要对捕获更细致的结构,可能需要了解原子组等,但不要在意这些细节,一般的递归匹配已经简单可以上手啦😁

广东省
浏览 499
1
5
分享
5 +1
2
1 +1
全部评论 2
 
厚积、薄发
学习
· 山东省
回复
 
Boyuan
这就找个例子试一下
· 河南省
回复