正则表达式匹配,但不在乳胶环境中

Regex matching, but not inside latex environment

我想替换 Latex 文档中的引号。它是用德语写成的,这意味着所有引号都应该是“'文本”'的形式,但是文档的一些编辑者使用了这些:"text",''文本''。 这里的复杂之处在于,该文档包含使用 lstlisting 环境的突出显示代码。那里的引号不应该被替换。

我有一个正则表达式,它匹配不需要的引号内的文本,即使有多个单词也是如此:

((``((\w+\s*)+)'')|("((\w+\s*)+)"))

我还有一个正则表达式,它匹配一个字符串("asdf" 在这种情况下),只有当它不在 lstlisting 环境中时:

"asdf"(?=((?!\end\{lstlisting\}).)*\begin\{lstlisting\}?)

它们单独工作时很好,但是当我像这样组合它们时:

((``((\w+\s*)+)'')|("((\w+\s*)+)"))(?=((?!\end\{lstlisting\}).)*\begin\{lstlisting\}?)

一些应该匹配的引用字符串没有匹配,而且整个文档都匹配。

PS:我目前使用notepad++进行匹配,因为它允许.匹配\n

[编辑]:它工作正常,只要我将第一部分限制为单个单词:

((``((\w)+)'')|("((\w)+)"))(?=((?!\end\{lstlisting\}).)*\begin\{lstlisting\}?)

要匹配带有空格的单词,您可以使用

(``[\w\s]+''|"[\w\s]+")(?=(?:(?!\end\{lstlisting\}).)*\begin\{lstlisting\}?)

regex demo

如果只有 ``'' 之间或 " 之间有空格,则需要将 [\w\s]+ 部分展开为 \w+(?:\s+\w+)* .