正则表达式仅在级别 1 匹配另一个命令中的 latex 命令

Regex to match latex command inside another command only at level 1

提问人:atapaka 提问时间:10/26/2023 更新时间:10/26/2023 访问量:63

问:

有没有办法通过正则表达式匹配命令(我主要用来做替换)并用大括号包围它,另一方面,删除它们?LaTeXperl

该命令可以是文本的任何部分,具有结构:它以反斜杠开头,后跟命令名称,可选地后跟括号,后跟任意数量的大括号对,其中可以有任何其他乳胶命令:LaTeX\

\com1[options]{ something possibly with \othercommand{ that } can also have arbitrary number of curly braces }

最终,我只想对第一级(在另一个命令中)的所有命令执行此操作。但是我只能为外部命令执行此操作:

(?<=[^{])(\\(?:com1)(?:\[[^[]]*\])?(\{((?>[^{}]|(?2))*)\})*)

似乎可以很好地匹配任何零电平,然后简单地达到效果,例如:{$1}

\com1[opts]{ some \qtyrange{100}{200}{\celsius} and }{something else \gls{abc} $1=1$ not \colortext{\red}{\underline{text}}}

{\com1[opts]{ some \qtyrange{100}{200}{\celsius} and }{something else \gls{abc} $1=1$ not \colortext{\red}{\underline{text}}}}

并返回:

\{(\\(?:com1)(?:\[[^[]]*\])?(\{((?>[^{}]|(?2))*)\})*)\}

替换为 做工作。但是,当命令位于另一个命令中时,平衡括号会变得难以捉摸。基本上,我想要$1

\rpl{text}{ some\com1[opts]{ some \qtyrange{100}{200}{\celsius} and }{something else \gls{abc} $1=1$ not \colortext{\red}{\underline{text}}} but this is already braced {\qtyrange{100}{200}{\celsius}}}

应该导致

\rpl{text}{ some {\com1[opts]{ some \qtyrange{100}{200}{\celsius} and }{something else \gls{abc} $1=1$ not \colortext{\red}{\underline{text}}}} but this is already braced {\qtyrange{100}{200}{\celsius}}}

并且还能够从最后一个示例中删除大括号以获得:

\rpl{text}{ some \com1[opts]{ some \qtyrange{100}{200}{\celsius} and }{something else \gls{abc} $1=1$ not \colortext{\red}{\underline{text}}} but this is already braced \qtyrange{100}{200}{\celsius}}

我玩过,但由于我不能在其中使用量词,我不确定如何处理这个问题。lookbehind

正则表达式 Perl

评论

1赞 choroba 10/26/2023
为了平衡括号,我会使用递归子模式(perlre)。
0赞 Jim Garrison 10/26/2023
“有些人在遇到问题时会想“我知道,我会用正则表达式。”现在他们有两个问题。-- [杰米·扎温斯基]
1赞 Shawn 10/26/2023
您已经发布了许多关于使用正则表达式操作乳胶的问题。不同的方法可能会更好。在CPAN上快速搜索发现了LaTeX::TOM,这可能值得研究。可能还有其他选择。
0赞 atapaka 10/27/2023
@Shawn 只有当它确实有效时,它才会是一个很好的工具。它一团糟,无法识别具有多个参数或文档开头的命令。但是像这样的工具可以解决所有问题。

答:

-1赞 DuesserBaest 10/26/2023 #1

这个怎么样?(https://regex101.com/r/oBT25u/latest)

(?<prefix>{[^\\}]++)(?<first_lvl_command>\\\w+(?:\[[^]]++]?({(?:[^{}]+|(?3))*+}))({(?:[^{}]+|(?3))*+})?)(?<closing_bracket>})

prefix group 捕获第一个嵌套命令之前的所有内容。 第一级命令使用递归捕获可选命令和两次可能嵌套括号的命令。[...]{...}


无法编辑您的帖子,因为它影响少于 6 个字符,但您在主命令的末尾缺少结束语。}