用于在LaTeX命令中提取参数的正则表达式

时间:2014-09-24 23:23:24

标签: regex latex

我有一个大型的LaTeX文档,我已经定义了这样一个宏:

\newcommand{\abs}[1]{\left|#1\right|}

我希望通过\abs{...}替换所有文档\left|...\right|来摆脱它,所以我在用正则表达式思考。我熟悉他们的基础知识,但我不知道如何找到关闭表达式的括号,因为以下情况是可能的:

  1. \abs{(2+x)^3}
  2. \abs{\frac{2}{3}}
  3. \abs{\frac{2}{\sin(2\abs{x})}}
  4. 我目前能够做的是\\abs\{([^\}]*)\},然后替换为\left\1\right|,但它只能处理第一类代码。

    顺便说一句,我正在使用TeXstudio正则表达式引擎。

1 个答案:

答案 0 :(得分:2)

嗯,我做了一些研究,我设法解决了。根据类似问题中的this response,使用递归正则表达式和支持它们的文本编辑器就足够了,例如Sublime Text 2(我不能用TeXstudio来做)。这就是诀窍:

查找:\\abs\{(([^\{\}]|(?R))*)\}

替换:\\left|\1\\right|

编辑1:实际上这只解决了两个第一个案例,但是第三个案例失败了,所以任何关于如何改进正则表达式的想法都会受到赞赏。

编辑2:使用\\abs\{((?>[^{}]+|\{(?1)\})*)\}

查看来自@CasimiretHippolyte的评论以获得完整答案