搜索 (LaTeX) regex found NOT in another regex (math mode)

Search for (LaTeX) regex found NOT within another regex (math mode)

我试图在 LaTeX 中找到所有不在数学模式内的不正确编写的命令。也就是说,在下面,我想匹配“\bad”而不是“\good\”或“\math”。

Example of \bad command. Example of \good\ command. And $x=\math + y$ is also a good command.

我想出了如何匹配数学模式,它以非转义美元符号“$”开始和结束——我基本上想以某种方式反转这个匹配:

(?<!\)$.+?[^\]$

我想出了如何匹配“\bad”而不是“\good\”(注意 + 后面的 space):

\[A-Za-z]+ 

但我不知道如何将两者结合起来。我已经尝试过(否定的)环顾四周,但似乎没有任何进展(并非每个段落都必须包含数学模式)。有 suggestions/hints 吗?提前致谢!

编辑:

  1. 我正在使用与 Perl 兼容的正则表达式(确切地说是 Sublime Text 3)。
  2. "bad" 命令是一个不在数学模式中的宏,后跟 space。 "good" 命令是一个宏,后跟任何其他内容(标点符号或反斜杠)或数学模式中的任何宏。

Sublime Text 使用 Boost 库来处理正则表达式,因此它不完全兼容 Perl。

真正的 Perl 兼容答案是:

$.*?$(*SKIP)(*FAIL)|\\w+(?=\s)

Demo

但不幸的是,您不能在 Boost 中使用 (*SKIP)(*FAIL) 技巧(直到 this feature request 实现)。

你可以像这样解决这个问题:

$.*?$\K|\\w+(?(?=\s)|\K)

Demo

这种方法的问题是 "bad" 命令和数学模式结束标记将 仍然 产生一个空的(零-length) 匹配(感谢 \K)。不知道对你来说够不够好