我如何使用来匹配控制序列\regex_match
?此代码
\newcommand{\iw}[1]{\immediate\write16{#1}}
\iw{1 should be true}
\regex_match:nnTF {May} {May} {\iw{TRUE}} {\iw{FALSE}}
\newcommand{\z}{May}
\iw{2 should be true}
\regex_match:nnTF {May} {\z} {\iw{TRUE}} {\iw{FALSE}}
印刷
1shouldbetrue
TRUE
2shouldbetrue
FALSE
我希望它打印出来
1shouldbetrue
TRUE
2shouldbetrue
TRUE
答案1
我不太熟悉,l3regex
所以无法评论是否有更好/更合适的方法来实现你想要的功能(除了似乎不需要正则表达式之外)。但是,我认为上述代码的问题在于宏
\regex_match:nnTF {May} {\z} {\iw{TRUE}} {\iw{FALSE}}
是May
与进行比较\z
,而不是像您预期的那样May
与 的内容进行比较\z
。这是因为nn
参数说明符的部分表示不对参数执行任何操作。您想要的是\z
在进行比较之前将第二个参数替换为其替换文本。这可以通过使用参数类型来实现V
。
再次,由于不熟悉,l3regex
我无法说是否有更好的“内置”方法来实现这一点,但一种选择是使用 来expl3
生成具有正确参数类型的变体。我在下面用
\cs_generate_variant:Nn \regex_match:nnTF {nV}
之后你可以打电话
\regex_match:nVTF {May} \z {\iw{TRUE}} {\iw{FALSE}}
\z
在进行比较之前,when会被替换为其值。
在上述代码的具体示例中,无需使用正则表达式,即可使用以下方法之一完成相同的操作
\tl_if_in:NnTF \z {May} {\iw{TRUE}} {\iw{FALSE}}
\cs_generate_variant:Nn \tl_if_in:nnTF {nV}
\tl_if_in:NnTF {May} \z {\iw{TRUE}} {\iw{FALSE}}
或者,
\cs_generate_variant:Nn \tl_if_eq:nnTF {nV}
\tl_if_eq:nVTF {May} \z {\iw{TRUE}} {\iw{FALSE}}
取决于你的意图。
\documentclass{article}
\usepackage{l3regex}
\ExplSyntaxOn
\newcommand{\iw}[1]{\immediate\write16{#1}}
\iw{1 should be true}
\regex_match:nnTF {May} {May} {\iw{TRUE}} {\iw{FALSE}}
\newcommand{\z}{May}
\iw{2 should be true}
\cs_generate_variant:Nn \regex_match:nnTF {nV}
\regex_match:nVTF {May} \z {\iw{TRUE}} {\iw{FALSE}}
\ExplSyntaxOff
\begin{document}
\end{document}