\regex_match_case 帮助

\regex_match_case 帮助

我需要一些关于 Latex3 中 Regex 的解释,主要是,为什么我在标记列表中搜索特定表达式时遇到困难。如果我将其写为:

\regex_match_case:nnTF {
    { SC }{ MHM~ }
    { [b-dq-w] }{ NOPE~ }
}{ SC70-6C }
{ OK~ }
{ nOK~ }

没有问题,我得到了正确的输出(MHM 和 OK)。但是如果我插入该文本,\tl_set:Nn \l_tmpa_tl { SC70-6C }我得到的是“nOK”,即使在日志中我可以看到正确的文本在 (SC70-6C)。还尝试将“tl”转换为字符串,仍然得到相同的“nOK”。

\documentclass{article}

\ExplSyntaxOn
\cs_set:Npn \l_tmpa_cs
{
%these work 
%   \regex_match:nnTF { b [cde]* } { abecdcx } { TRUE~ } { FALSE~ }
%   \regex_match:nnTF { [b-dq-w] } { example } { TRUE~ } { FALSE~ }
    
%   \regex_match_case:nnTF {
%       { b [cde]* }{ YES~ }
%       { [b-dq-w] }{ NO~ }
%   }{ abecdcx }
%   { OK~ }
%   { nOK~ }

%   \regex_match_case:nnTF {
%       { SC }{ MHM~ }
%       { [b-dq-w] }{ NOPE~ }
%   }{ SC70-6C }
%   { OK~ }
%   { nOK~ }

%does not work; I always get nOK
    \tl_set:Nn \l_tmpa_tl { SC70-6C }
    \tl_set:Nx \l_tmpb_tl { \l_tmpa_tl }
    %\tl_set:Nx \l_tmpb_tl { \tl_to_str:N { \l_tmpa_tl } }
    
    \tl_log:N \l_tmpa_tl
    
    \regex_match_case:nnTF {
        { SC }{ MHM~ }
        { [b-dq-w] }{ NOPE~ }
    }{ \l_tmpb_tl }
    { OK~ }
    { nOK~\tl_log:N \l_tmpb_tl }
}

\cs_set_eq:NN \DoStuff \l_tmpa_cs%

\ExplSyntaxOff

\begin{document}
    \DoStuff
\end{document}

任何帮助将不胜感激。

答案1

的第二个参数\regex_match_case:nnTF指定为n,因此它需要一个“明确的”标记列表。

如果你想传递标记列表变量的内容,你可以这样做

\prg_generate_conditional_variant:Nnn \regex_match_case:nn {nV} {T,F,TF}

然后你的代码就可以

\documentclass{article}

\ExplSyntaxOn
\prg_generate_conditional_variant:Nnn \regex_match_case:nn {nV} {T,F,TF}

\cs_new_protected:Npn \maag_dostuff:
  {
    \tl_set:Nn \l_tmpa_tl { SC70-6C }
    \tl_set:Nx \l_tmpb_tl { \l_tmpa_tl }
    
    \regex_match_case:nVTF
      {
        { SC }{ MHM~ }
        { [b-dq-w] }{ NOPE~ }
      }
      \l_tmpb_tl
      { OK~ }
      { nOK~\tl_log:N \l_tmpb_tl }
}

\cs_set_eq:NN \DoStuff \maag_dostuff:

\ExplSyntaxOff

\begin{document}

\DoStuff

\end{document}

在此处输入图片描述

注意,protected因为函数执行不可扩展的工作;另外,函数不应该有l_g_前缀和必须有签名。

另外,\cs_set_protected:Npn应该是\cs_new_protected:Npn。仅当您知道定义的函数应该重新定义,恕不另行通知。

相关内容