提问人:atapaka 提问时间:10/26/2023 更新时间:10/26/2023 访问量:63
正则表达式仅在级别 1 匹配另一个命令中的 latex 命令
Regex to match latex command inside another command only at level 1
问:
有没有办法通过正则表达式匹配命令(我主要用来做替换)并用大括号包围它,另一方面,删除它们?LaTeX
perl
该命令可以是文本的任何部分,具有结构:它以反斜杠开头,后跟命令名称,可选地后跟括号,后跟任意数量的大括号对,其中可以有任何其他乳胶命令: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
答:
-1赞
DuesserBaest
10/26/2023
#1
这个怎么样?(https://regex101.com/r/oBT25u/latest)
(?<prefix>{[^\\}]++)(?<first_lvl_command>\\\w+(?:\[[^]]++]?({(?:[^{}]+|(?3))*+}))({(?:[^{}]+|(?3))*+})?)(?<closing_bracket>})
prefix group 捕获第一个嵌套命令之前的所有内容。
第一级命令使用递归捕获可选命令和两次可能嵌套括号的命令。[...]
{...}
无法编辑您的帖子,因为它影响少于 6 个字符,但您在主命令的末尾缺少结束语。}
评论
LaTeX::TOM
,这可能值得研究。可能还有其他选择。