expl3:多次匹配正则表达式模式

expl3:多次匹配正则表达式模式

我想匹配>>字符串中的模式“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}

在此处输入图片描述

相关内容