【问题标题】:Regex matching, but not inside latex environment正则表达式匹配,但不在乳胶环境中
【发布时间】:2016-05-17 09:36:22
【问题描述】:

我想替换乳胶文档中的引号。它是用德语写的,这意味着所有的引号都应该是“'text”'的形式,但是文件的一些编辑使用了这些:“text”,''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)+)'')|("((\w)+)"))(?=((?!\\end\{lstlisting\}).)*\\begin\{lstlisting\}?) 可以很好地处理单个单词。但是\w+ 匹配一个单词。试试(``.*?''|".*?")(?=(?:(?!\\end\{lstlisting\}).)*\\begin\{lstlisting\}?)
  • 我知道 \w+ 只匹配单个单词,这就是我使用 (\w+\s*)+ 匹配多个单词的原因。您的建议有一个缺点:在这种情况下:“text” more text “text2” 只有 text 和 text2 应该匹配,但“more text”也是。
  • 这个(\w+\s*)+ 可能会导致问题,您最好使用[\w\s]+。但是,我觉得在您提供一些您遇到问题的示例输入之前,没有人可以为您提供足够的帮助。

标签: regex latex notepad++ environment


【解决方案1】:

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

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

regex demo

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

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多