Regex 用于除多字符标记以外的任何内容的正则表达式

Regex 用于除多字符标记以外的任何内容的正则表达式,regex,string,regex-negation,Regex,String,Regex Negation,我想创建一个正则表达式,它返回两个多字符标记之间的所有内容,其中开始标记是;;(而结束标记是;),例如 ;;( Capture this part, which can contain everything except the closing token ;;) 我认为正则表达式/\((?!;;\));;\)/使用负前瞻应该可以工作,但这不会返回匹配项。是否可以为此使用正则表达式?使用正向后向和正向前向 (?<=;;\().*?(?=;;\)) (?为了匹配两个多字符分隔符之间

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

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

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

使用正向后向和正向前向

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

(?为了匹配两个多字符分隔符之间的某些文本,需要一个正则表达式,该正则表达式符合展开循环的技术

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

惰性点匹配正则表达式是。这种模式效率不高,因为当输入越来越大的文本时,它会变得越来越慢

像这样展开它会使匹配线性化,如果块内有许多
,则速度可能会出现唯一问题

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

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

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

展开的部分与什么匹配?

  • [^;]*
    -除了
    之外的任何东西(尾随分隔符的第一个字符)
  • (?:;(?!;\)[^;]*)*
    -零个或多个。。。
    • ;(?!;\)
      -尾随分隔符的第一个字符,一个文本
      后面不跟
      ;)(尾随分隔符的其余部分)
    • [^;]*
      -除
      以外的零个或多个字符(尾随分隔符的第一个字符)

我不推荐这里有任何长相。只需捕获所需内容,匹配分隔符,但不捕获它们。使用
/\((.*);\)/
并获取索引为1的值。环顾四周会带来额外的开销。它们也不是所有语言都支持的。@Stribizev我喜欢lookahead/behind,因为当您想在一个较长的字符串中找到多个这样的组时,这种方法不会中断。您可以对我的regex版本执行同样的操作。效率更高,速度更快。我不会使用惰性点匹配,我会使用展开的点匹配。你的需要169步。我想这需要16个步骤。我想我需要发布它。@Stribizev您是对的,它在这里工作是因为令牌不能重叠,因此您不会有使用开始/结束令牌的问题。观察得好!