调用 \regex_match 时遇到问题

调用 \regex_match 时遇到问题

这按预期工作:

\documentclass{minimal}
\ExplSyntaxOn
  % USE X instead of \space for a space.
  \catcode`\X=\active
  \defX{\space }

  % \mycheck:nnn <regex> <string to test against regex> <end of error message>
  \cs_set:Npn \mycheck:nnn #1#2#3
  {
    \regex_match:nnTF
      {#1}
      {#2}
      { \typeout{Match.} }
      {
        \typeout{NoXmatch.}
        \typeout{ItXshouldXbeX#3.}
      }
  }
  \mycheck:nnn {\A(true|false)\Z} {true}    {`true'XorX`false'}
  \mycheck:nnn {\A(true|false)\Z} {false}   {`true'XorX`false'}
  \mycheck:nnn {\A(true|false)\Z} {neither} {`true'XorX`false'}
\ExplSyntaxOff
\begin{document}
\end{document}

我想使用可以调用它的东西,例如,

\def\cs{true}  % or false or something else
\newcheck {\A(true|false)\Z} {cs} {`true'XorX`false'}

并检查 \cs 的值。我想在改进的错误消息中使用 cs 名称和 \cs 的值。实际上,正则表达式、cs 和错误消息的结尾都会发生变化。有时正则表达式不会检查几个值中的一个。

答案1

如果您想将 csname 作为第二个参数传递,那么您需要一个变体。

\documentclass{article}

\ExplSyntaxOn
% \mycheck:nnn <regex> <string to test against regex> <end of error message>
\cs_new_protected:Nn \mycheck:nnn
  {
    \regex_match:nnTF
      {#1}
      {#2}
      { \typeout{Match.} }
      {
        \typeout{No~match.}
        \typeout{It~should~be~#3.}
      }
  }
\mycheck:nnn {\A(true|false)\Z} {true}    {`true'~or~`false'}
\mycheck:nnn {\A(true|false)\Z} {false}   {`true'~or~`false'}
\mycheck:nnn {\A(true|false)\Z} {neither} {`true'~or~`false'}

\cs_generate_variant:Nn \mycheck:nnn { nv }

\def\cs{true}

\mycheck:nvn {\A(true|false)\Z} {cs} {`true'~or~`false'}

\ExplSyntaxOff

\stop

相关的控制台输出是

Match.
Match.
No match.
It should be `true' or `false'.
Match.

X部分是绝对要避免的:为了获得空格,您需要输入~如上面的代码。

答案2

以下是我想出的在错误消息中打印控制序列名称和控制序列值的方法:

\documentclass{minimal}
\ExplSyntaxOn
  % \mycheck:nnn <regex> <string to test against regex> <end of error message>
  \cs_set:Npn \mycheck:nnn #1#2#3
    {
      \regex_match:nnTF
        {#1}
        {#2}
        { \typeout{Match.} }
        {
          \typeout{No~match.}
          % \remember contains the `~'
          \typeout{\c_backslash_str\remember is~`#2'.}
          \typeout{It~should~be~#3.}
          \stop
        }
    }

  \cs_generate_variant:Nn \mycheck:nnn { nv }

  \cs_set:Npn \Check:nnn #1#2#3
    {
      \def\remember{#2~}
      \mycheck:nvn {\A(true|false)\Z} {#2} {`true'~or~`false'}
    }

  \def\cs{true}
  \Check:nnn {\A(true|false)\Z} {cs} {`true'~or~`false'}
  \def\cs{false}
  \Check:nnn {\A(true|false)\Z} {cs} {`true'~or~`false'}
  \def\cs{neither}
  \Check:nnn {\A(true|false)\Z} {cs} {`true'~or~`false'}
\ExplSyntaxOff
\begin{document}
\end{document}

相关内容