前瞻在 TeXWorks 中有效吗?

前瞻在 TeXWorks 中有效吗?

不必要的背景

最近,我发现我遇到了有关文档中空格数错误的细微问题,因为没有参数的文本模式下的 LaTeX 命令会占用一个空格(例如,正如人们所预料的那样,\textgreater here给出<here而不是)。< here

因此,在文本模式下,应始终使用空括号(数学模式下不显示空格)编写不带参数的命令。示例将变为\textgreater{} here,实际上给出< here。(数学模式不显示文档中的空格。)

为了搜索这些命令(LaTeX 命令后面没有括号,但有一个空格字符,后面有一个单词字符,全部在文本模式下),我将使用正则表达式。这可能不是最简单的任务,但我的文档是大的并使用许多命令,因此我努力寻找一种比通过简单搜索手动审查数百到数千个误报更优雅的方式。

请保持冷静:在没有备份并且没有检查我的智能正则表达式找到的所有条目之前,我不愿意自动执行添加额外括号的任务。:-)

我的问题

我偶然发现了 TeXWorks 中的正则表达式搜索功能,它使用了 QT 4 正则表达式的子集。我尝试在文档中使用前瞻功能,但它并没有像我预期的那样快速运行,而是无限期地冻结了程序。

这已经发生在一个最小正则表达式上,应用于一个最小文档。我正在使用完全更新的 MikTeX。

我记得前段时间使用 C++/QT 时,高级正则表达式遇到了很大问题。但这可能是因为被迫使用过时的标准。

复制步骤

  1. 打开一个新文档,内容为“a b”(不带“”)。
  2. 搜索 -> 查找... -> 在输入字段中输入“(?=a)(?=c)”(不带“”)。执行此操作时,请注意正则表达式中的空格将被解释​​为文档中的空格,因此不允许构造正则表达式。
  3. 激活“正则表达式”选项。
  4. 你的计算机应该在出汗。

问题

你能重现它吗?为什么会发生这种情况?是我的错,还是我发现了软件(TeXWorks / QT)中的错误?我是否正确理解了无参数命令后空格的基本含义?

请原谅我的英语不好,我愿意改进。

编辑1:使用锚子正则表达式也不起作用,但至少很快就生成了一个结果:我使用“\w(?=a)”作为新正则表达式(以匹配第一个“a”),但没有找到匹配项。(感谢@David Carlisle 提出此建议。)

编辑2:关于解决方案的经验

对于那些感兴趣的人:最初的想法是识别我是否处于数学模式(不,我不使用 \$),但由于 TeXWorks 正则表达式引擎(QRegularException 类)中不可能实现可变长度后向查找,因此失败了。(我不愿意浪费更多时间来解决这个限制。)

但随着正则表达式测试器,我能够用消除法来减少有趣的匹配的数量:大正则表达式(\\ (?!item)(?=\w+) ((?!emptyset) (?!dots\s+\\\}) (?!in) (?!notin) (?!label) (?!coloneqq) (?!forall) (?!to) (?!exists) (?!subset) (?!Gamma) (?!Sigma) (?!times) (?!geq) (?!Omega) (?!cup) (?!setminus) (?!eqqcolon)) \w+[^\S\n]) | (\\item\s\s)将匹配数缩小到 28。

我不得不与测试站点合作,因为这个正则表达式在 TeXWorks / QT 中似乎无效。也许,冻结问题与这个问题。因此,使用 grep 应该可以解决冻结问题。

这绝对不值得以工作进度来衡量,但我学到了很多关于前瞻的知识——这是纯粹的快乐。

编辑 3:最终结果 我添加了(?!dots\s\\\\)进一步将匹配数减少到 16。手动检查所有匹配项后,结果只有一个 \item,后面跟着两个空格:结果非常少。此外,检查命令字符的紧迫性&变得清晰起来。我认为这是一个命令,因此无需采取进一步措施。

答案1

正则表达式语法在这里不属于主题,但是

(?=a)(?=c)

a匹配紧随其后的空字符串,c因此它不会匹配任何输入中的任何内容,但某些正则表达式引擎可能需要一段时间才能找到任何东西。

编辑建议

\w(?=a)

与紧跟 的任何字母匹配a,因此在建议的输入中找不到任何内容a b

相关内容