【发布时间】: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