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您是对的,它在这里工作是因为令牌不能重叠,因此您不会有使用开始/结束令牌的问题。观察得好!