以 .* 开头的否定前瞻
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}}}}
和你匹配的最后一个“}”等
您需要一个解析器来正确执行此操作,而不是正则表达式。对不起。
我想 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}}}}
和你匹配的最后一个“}”等
您需要一个解析器来正确执行此操作,而不是正则表达式。对不起。