我需要一些关于 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
。仅当您知道定义的函数应该重新定义,恕不另行通知。