我有一个大型的LaTeX文档,我已经定义了这样一个宏:
\newcommand{\abs}[1]{\left|#1\right|}
我希望通过\abs{...}
替换所有文档\left|...\right|
来摆脱它,所以我在用正则表达式思考。我熟悉他们的基础知识,但我不知道如何找到关闭表达式的括号,因为以下情况是可能的:
\abs{(2+x)^3}
\abs{\frac{2}{3}}
\abs{\frac{2}{\sin(2\abs{x})}}
我目前能够做的是\\abs\{([^\}]*)\}
,然后替换为\left\1\right|
,但它只能处理第一类代码。
顺便说一句,我正在使用TeXstudio正则表达式引擎。
答案 0 :(得分:2)
嗯,我做了一些研究,我设法解决了。根据类似问题中的this response,使用递归正则表达式和支持它们的文本编辑器就足够了,例如Sublime Text 2(我不能用TeXstudio来做)。这就是诀窍:
查找:\\abs\{(([^\{\}]|(?R))*)\}
替换:\\left|\1\\right|
编辑1:实际上这只解决了两个第一个案例,但是第三个案例失败了,所以任何关于如何改进正则表达式的想法都会受到赞赏。
编辑2:使用\\abs\{((?>[^{}]+|\{(?1)\})*)\}