【发布时间】:2012-05-19 20:35:25
【问题描述】:
这个问题与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。
【问题讨论】:
-
你好。我的回答有帮助吗?如果不是,你能解释一下怎么做吗?
-
@Kobi:查看您的示例 (regex101.com/r/aG7wP4) 时,它仅匹配最外面的块,除非其中一个模式不匹配(BEGIN 或 END 关键字之一拼写错误或省略) .
标签: regex pcre recursive-regex