我想创建一个正则表达式,它返回两个多字符标记之间的所有内容,其中开放标记为;;(
,结束标记为;;)
,例如
;;(
Capture this part, which can contain everything except the closing token
;;)
我认为使用负向前瞻的正则表达式/;;\((?!;;\));;\)/
应该可以正常工作,但这不会返回任何匹配项。是否可以使用正则表达式?
答案 0 :(得分:2)
为了匹配两个多字符分隔符之间的某些文本,正则表达式符合 unroll-the-loop 技术。
因此,我们有;;(
和;;)
分隔符。
惰性点匹配正则表达式为;;\((.*?);;\)
。这种模式效率不高,因为当较大和较大的文本作为输入时,它会变得越来越慢。
像;;\(([^;]*(?:;(?!;\))[^;]*)*);;\)
一样展开它会使匹配变为线性,如果块内有很多;
,速度就会出现唯一的问题。
完成比赛需要timgeb的解决方案 169 步骤。我只需 16 步骤。
此外,展开的正则表达式不依赖于/s
DOTALL修饰符,可以省略。
为什么不使用外观?当您需要重叠匹配或有特定条件时,外观很好。在这种情况下,您需要非重叠匹配,因为前导和尾随分隔符不相等。 使用捕获组,在您需要获取的子模式周围使用未转义的括号。在;;\(([^;]*(?:;(?!;\))[^;]*)*);;\)
中,我们需要获取所有不是;;)
的文本,即此[^;]*(?:;(?!;\))[^;]*)*
部分。因此,我们将其与()
括起来。
此展开的部分匹配什么?
[^;]*
- 除;
之外的任何内容(尾随分隔符的第一个字符)(?:;(?!;\))[^;]*)*
- 零个或多个序列......
;(?!;\))
- 尾随分隔符的第一个字符,一个未跟;
的文字;)
(尾随分隔符的其余部分)[^;]*
- 除;
以外的零个或多个字符(尾随分隔符的第一个字符)答案 1 :(得分:0)