如何应用 \regex_replace_all 直到文本停止变化?

如何应用 \regex_replace_all 直到文本停止变化?

看看这段代码:

\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}

相关内容