假设我想用 替换\A{ <balanced text> }
我的令牌列表中所有出现的\B{ \A{ <the same content> } }
。
例如
\process{\A{123}} % -> \processresult = \B{\A{123}}
\process{before \A{1{2}3} after} % -> \processresult = before \B{\A{1{2}3}} after
\process{before {\A} after} % -> don't need to support this case, but probably no-op
有没有简单的方法可以做到这一点?
如果代码还支持的话就更好了:
- 支持“平衡文本”具有任意深度(而不是例如 1 级)
- 保留字符代码
{}
- 保留空白
我不认为 l3regex 可以做到这一点?(两者(.*)
都不(.*?)
关心平衡水平)
实际上,我已经用“困难”的方式自己编写了\tl_analysis_map_inline:nn
。
我认为使用递归函数也可以实现,尽管我不确定它是否可以保留字符代码{}
。
正则表达式的(简单)应用无法工作的示例:
%! TEX program = lualatex
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\def\process #1 {
\def \__a {#1}
\texttt{ input:~ \exp_args:NV \detokenize \__a } \par
\regex_replace_all:nnN {\c{A} \cB\{ (.*) \cE\}} {\c{B} \cBx \1 \cEy } \__a
\texttt{ output:\exp_args:NV \detokenize \__a } \par
}
\process{before \A{1{2}3} \A{1{2}3} after}
\def\process #1 {
\def \__a {#1}
\texttt{ input:~ \exp_args:NV \detokenize \__a } \par
\regex_replace_all:nnN {(\c{A} \cB\{ .*? \cE\})} {\c{B} \cB[ \1 \cE] } \__a
\texttt{ output:\exp_args:NV \detokenize \__a } \par
}
\process{before \A{1{2}3} \A{1{2}3} after}
\ExplSyntaxOff
\end{document}
结果:
input: before\A {1{2}3}\A {1{2}3}after
output:before\B x1{2}3}\A {1{2}3yafter
input: before\A {1{2}3}\A {1{2}3}after
output:before\B [\A {1{2}]3}\B [\A {1{2}]3}after
这里用新的括号组[]
代替,以{}
清楚地显示差异……可以看出里面的内容并不平衡。