![如何应用 \regex_replace_all 直到文本停止变化?](https://linux22.com/image/466868/%E5%A6%82%E4%BD%95%E5%BA%94%E7%94%A8%20%5Cregex_replace_all%20%E7%9B%B4%E5%88%B0%E6%96%87%E6%9C%AC%E5%81%9C%E6%AD%A2%E5%8F%98%E5%8C%96%EF%BC%9F.png)
看看这段代码:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\tl_set:Nn\l__foo{a a a b a a a}
\regex_replace_all:nnN { a (.+) a }{ [ \1 ] } \l__foo
\regex_replace_all:nnN { a (.+) a }{ [ \1 ] } \l__foo
\regex_replace_all:nnN { a (.+) a }{ [ \1 ] } \l__foo
\l__foo
\ExplSyntaxOff
\end{document}
它呈现:
[[[b]]]
如您所见,我必须使用\regex_replace_all
三次。这显然是代码重复。此外,当输入(a a a b a a a
)不是常量而是命令的参数时,这是不可接受的。我如何摆脱代码重复并确保将\regex_replace_all
其应用于文本直到它停止变化?
请不要建议更改正则表达式,这只是一个激励的例子,我的实际用例是不同的。
答案1
T
如果匹配成功,您可以使用运行真实分支的形式:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\tl_set:Nn\l__foo{a a a b a a a}
\cs_new:Npn\foo_aux: {
\regex_replace_all:nnNT { a (.+) a }{ [ \1 ] } \l__foo \foo_aux:
}
\foo_aux:
\l__foo
\ExplSyntaxOff
\end{document}