如何使用 \regex_match 匹配控制序列?

如何使用 \regex_match 匹配控制序列?

我如何使用来匹配控制序列\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}

相关内容