如何在令牌列表中搜索并替换平衡组?

如何在令牌列表中搜索并替换平衡组?

假设我想用 替换\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

这里用新的括号组[]代替,以{}清楚地显示差异……可以看出里面的内容并不平衡。

相关内容