这个问题与 PCRE 有关。
我已经看到了对与此构造一起使用的嵌套括号的递归搜索:
\(((?>[^()]+)|(?R))*\)
这样做的问题是,虽然 ' [^()]+ ' 可以匹配任何字符,包括换行符,但您只能匹配单字符字符,例如大括号、方括号、标点符号、单个字母等。
我想要做的是用任何类型的模式(例如,'BEGIN' 和'END' 之类的关键字)替换'(' 和')' 字符。
我想出了以下构造:
(?xs) (?# <-- 'xs' ignore whitespace in the search term, and allows '.'
to match newline )
(?P<pattern1>BEGIN)
(
(?> (?# <-- "once only" search )
(
(?! (?P=pattern1) | (?P<pattern2>END)).
)+
)
| (?R)
)*
END
这实际上适用于如下所示的内容:
BEGIN <<date>>
<<something>
BEGIN
<<something>>
END <<comment>>
BEGIN <<time>>
<<more somethings>>
BEGIN(cause we can)END
BEGINEND
END
<<something else>>
END
这成功匹配任何嵌套的 BEGIN..END 对。
我分别为BEGIN和END设置了命名模式pattern1和pattern2。在搜索词中使用pattern1效果很好。但是,我不能在搜索结束时使用pattern2:我必须写出' END '。
知道如何重写这个正则表达式,所以我只需指定一次模式并在代码中“无处不在”使用它们吗?换句话说,所以我不必在搜索的中间和最后都写END 。