除了多字符标记之外的任何东西的正则表达式

时间:2016-01-09 22:04:12

标签: regex string regex-negation

我想创建一个正则表达式,它返回两个多字符标记之间的所有内容,其中开放标记为;;(,结束标记为;;),例如

;;(
  Capture this part, which can contain everything except the closing token 
;;)

我认为使用负向前瞻的正则表达式/;;\((?!;;\));;\)/应该可以正常工作,但这不会返回任何匹配项。是否可以使用正则表达式?

2 个答案:

答案 0 :(得分:2)

为了匹配两个多字符分隔符之间的某些文本,正则表达式符合 unroll-the-loop 技术。

因此,我们有;;(;;)分隔符。

惰性点匹配正则表达式为;;\((.*?);;\)。这种模式效率不高,因为当较大和较大的文本作为输入时,它会变得越来越慢。

;;\(([^;]*(?:;(?!;\))[^;]*)*);;\)一样展开它会使匹配变为线性,如果块内有很多;,速度就会出现唯一的问题。

完成比赛需要timgeb的解决方案 169 步骤。我只需 16 步骤。

此外,展开的正则表达式不依赖于/s DOTALL修饰符,可以省略。

为什么不使用外观?当您需要重叠匹配或有特定条件时,外观很好。在这种情况下,您需要非重叠匹配,因为前导和尾随分隔符不相等使用捕获组,在您需要获取的子模式周围使用未转义的括号。在;;\(([^;]*(?:;(?!;\))[^;]*)*);;\)中,我们需要获取所有不是;;)的文本,即此[^;]*(?:;(?!;\))[^;]*)*部分。因此,我们将其与()括起来。

此展开的部分匹配什么?

  • [^;]* - 除;之外的任何内容(尾随分隔符的第一个字符)
  • (?:;(?!;\))[^;]*)* - 零个或多个序列......
    • ;(?!;\)) - 尾随分隔符的第一个字符,一个未跟;的文字;)(尾随分隔符的其余部分)
    • [^;]* - 除;以外的零个或多个字符(尾随分隔符的第一个字符)

答案 1 :(得分:0)

使用积极的外观和积极的前瞻。

(?<=;;\().*?(?=;;\))

演示:https://regex101.com/r/iK5wG4/2

相关问题