我想匹配>>
字符串中的模式“start with ”,并用命令替换它;如果>>
出现多个,它应该匹配并替换多次。
例如,给定字符串aaa>>bbb>>ccc
,我想将其转换为aaa\somecommand{bbb}\somecommand{ccc}
。我的想法是使用\regex_replace_all:nnN
,但我似乎找不到正确的正则表达式模式:例如,>>(.*)
只会匹配此字符串一次。如何正确实现这一点?
以下是 MWE:
\documentclass{article}
\begin{document}
\NewDocumentCommand \somecommand { m }
{
\begin{center} #1 \end{center}
}
\ExplSyntaxOn
\NewDocumentCommand \replace { m }
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN
{ >> ((?:.(?:?!>>))*.) } % needs to be changed
{ \c{somecommand}\{\1\} }
\l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\replace{aaa>>bbb>>ccc}
% expected: aaa\somecommand{bbb}\somecommand{ccc}
\end{document}
答案1
不需要使用正则表达式,除非您需要保留周围的空格>>
。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand \somecommand { m }
{
\jinwen_somecommand:n { #1 }
}
\NewDocumentCommand \replace { m }
{
\jinwen_replace:n { #1 }
}
\tl_new:N \l__jinwen_replace_head_tl
\seq_new:N \l__jinwen_replace_tail_seq
\cs_new:Nn \jinwen_somecommand:n { \,---\, #1 \,---\, }
\cs_new_protected:Nn \jinwen_replace:n
{
\seq_set_split:Nnn \l__jinwen_replace_tail_seq { >> } { #1 }
\seq_pop_left:NN \l__jinwen_replace_tail_seq \l__jinwen_replace_head_tl
\tl_use:N \l__jinwen_replace_head_tl
\seq_map_function:NN \l__jinwen_replace_tail_seq \jinwen_somecommand:n
}
\ExplSyntaxOff
X\replace{}X
\replace{aaa}
\replace{aaa>>bbb}
\replace{aaa>>bbb>>ccc}
\end{document}
答案2
仅使用带有包的 LaTeX2e listofitems
。请注意,命令的输出存储在标记列表中\mytoks
。
\documentclass{article}
\usepackage{listofitems}
\newtoks\mytoks
\newcommand\addtotoks[2]{\global#1\expandafter{\the#1#2}}
\newcommand\xaddtotoks[2]{\expandafter\addtotoks\expandafter
#1\expandafter{#2}}
\NewDocumentCommand \somecommand { m }
{
\begin{center} #1 \end{center}
}
\newcommand\replace[1]{%
\setsepchar{>>}%
\mytoks{}%
\readlist\mylist{#1}%
\foreachitem\z\in\mylist[]{%
\ifnum\zcnt=1\xaddtotoks\mytoks{\z}\else
\xaddtotoks\mytoks{\expandafter{\z}}\fi%
\ifnum\zcnt<\mylistlen \addtotoks\mytoks{\somecommand}\fi%
}%
\the\mytoks
}
\begin{document}
\replace{Initial Text>>Next Text Group>>The Final Text Group}
\end{document}