以 .* 开头的否定前瞻

Negative lookahead preceded by .*

我想 select {} 中的所有文本,但前提是其中没有 \status…{}

应匹配的示例:

\subsection{Hello}                -> "\subsection”, "Hello"
\section{Foobar}                  -> "\section", "Foobar"
\subsubsection{This is a Triumph} -> "\subsubsection", "This is a Triumph"

应该匹配的示例:

\subsection{Hello\statusdone{}}
\section{Hello World\statuswip{}}
\section{Everything\statusproofreading{}}

我认为负前瞻对此非常完美:

(\.*section)\{(.*)(?!\status.*)\}

但它们匹配:

\subsection{Hello\statusdone{}}           -> "\subsection", "Hello\statusdone{}"
\section{Hello World\statuswip{}}         -> "\section", "Hello World\statuswip{}"
\section{Everything\statusproofreading{}} -> "\section", "Everything\statusproofreading{}"

我怀疑这是因为 .* 在否定前瞻之前。如果我在以下正则表达式中将其替换为 e.g.g、Hello

(\.*section)\{(Hello)(?!\status.*)\}

它正确地不匹配第一个反例\subsection{Hello\statusdone{}}

我该如何解决这个问题?

您应该在模式中更早地移动否定前瞻,以便它在整个字符串 (.*) 被消耗之前检查该子字符串是否存在。

您可以使用:

\.*section\{((?!.*\status.*\{\})[^}]+)}

现场演示 here.

Regex 没有针不在干草堆内部测试仪。 (或者至少不是它的常见实现。)

您混淆了零宽度断言的工作方式。这是 ANY 匹配,而不是 ALL 匹配。第一个位置匹配的瞬间,即适合并且它 returns 它。

您面前有一项两次通过的工作。第一个问题是您在 LaTeX 或其他语言中没有正则语言,这意味着正则表达式不适用于任意文本。

\section{\math{\ref{\status{asfd}}}}和你匹配的最后一个“}”等

您需要一个解析器来正确执行此操作,而不是正则表达式。对不起。