简单理解正则里的递归匹配
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)?\)'
如果需要对捕获更细致的结构,可能需要了解原子组等,但不要在意这些细节,一般的递归匹配已经简单可以上手啦😁