我怎样才能\regex_replace_all:nnN
不删除之间的空格x y
?
\documentclass{article}
\usepackage{l3regex}
\ExplSyntaxOn
\cs_new:Npn \replace #1#2#3
{
\tl_set:Nn \l_tmpa_tl {#3}
\regex_replace_all:nnN {#1} {#2} \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\replace{a}{x y}{abc}
\end{document}
答案1
正则表达式替换的语法规则在某些方面相当奇怪;正如文档所述,搜索或替换字符串中的重要空格应始终被转义,因为未转义的空格会被忽略。
此外,您需要指定您想要一个具有正确类别代码的“真实”空间;如果您只是x\ y
在替换字符串中说,您将获得一个类别代码 12 的空间,它将打印当前字体的插槽 32 中的任何字符(在 OT1 编码中是一个奇怪的字形,在 T1 编码中,但在 T2A 中也是“可见空间”)。
所以最正确的语法是
\replace{a}{\cLx\cS\ \cLy}{abc}
指定 x 和 y 为普通字母:默认情况下l3regex
使用类别代码 12 字符。然而,这有点挑剔,因为类别代码 12 和 11 字符在打印时无法区分。
对于这样的简单替换,你可以使用
\tl_replace:Nnn
例如,
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\replace}{mmm}
{
\tl_set:Nn \l_tmpa_tl {#3}
\tl_replace_all:Nnn \l_tmpa_tl {#1} {#2}
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\replace{a}{x y}{abc}
\end{document}