提前查看数字 (expl3) – 或者任何正则表达式

提前查看数字 (expl3) – 或者任何正则表达式

有没有简单的方法可以提前查看数字?比如

\peek_charcode:NTF [0-9]

处理第 10 个巢的方法\peek_charcode:NTF相当麻烦。

我只想匹配数字。数字、括号和其他字符共享相同的 catcode。

答案1

站在巨人的肩膀上,并扩展了 Manuel 的想法,我想出了这个解决方案。我认为, a\regex_peek:nTF用途非常广泛,应该将其添加到 中l3regex

\documentclass{scrartcl}
\usepackage{expl3}
\usepackage{l3regex}
\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_match:nnTF { no }

\cs_new_protected:Npn \mh_regex_peek:nTF #1 #2 #3
  {
    \peek_catcode:NTF ##
      {#3}
      {
        \regex_match:noTF 
        { \A the\  (character|letter)\ (#1) \Z }
        { \token_to_meaning:N \l_peek_token } {#2} {#3}
      }
  }

\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 1 \par
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 2 \par
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } ( \par
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } {1} ~ (group) \par
\mh_regex_peek:nTF { [a] } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } 1 \par
\mh_regex_peek:nTF { [a] } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } a \par
\mh_regex_peek:nTF { [abc] } { is ~  a,  ~ b ~  or ~ c: ~ } { not ~  a,  ~ b ~  or ~ c: ~ } b \par
\mh_regex_peek:nTF { a|b|c } { is ~  a,  ~ b ~  or ~ c: ~ } { not ~ a,  ~ b ~  or ~ c: ~ } b \par
\mh_regex_peek:nTF { a|b|c } { is ~  a,  ~ b ~  or ~ c: ~ } { not ~ a,  ~ b ~  or ~ c: ~ } e \par
\end{document}

编辑:通过过滤 #,变得更加强大

编辑:切换到正则表达式{ \A the\ (character|letter)\ (#1) \Z }。如果有人知道一种转换为标记列表的好方法\l_peek_token,那么我就可以摆脱这种解决方法。附言:看来 Egreg 同时也抱有非常类似的想法。

聚苯硫醚该解决方案目前正在mhchem v4.00中使用。

答案2

一个起点(来自一个对 的深层内部一无所知的人expl3,对我来说,这只是似乎有效)。我想用,\token_case:NnTF但是该功能不存在。

\documentclass{scrartcl}
\usepackage{xparse}

\ExplSyntaxOn
\cs_new_protected:Npn \mh_peek_case:nTF #1 #2 #3
 {
  \cs_set_nopar:Npn \__mh_peek_case:w
   {
    \tl_case:NnTF \l_peek_token { #1 } { #2 } { #3 }
   }
  \peek_after:Nw \__mh_peek_case:w
 }

\NewDocumentCommand \checkfordigit { }
 {
  \mh_peek_case:nTF
   {
    {0}{} {1}{} {2}{} {3}{} {4}{}
    {5}{} {6}{} {7}{} {8}{} {9}{} 
   }
   { Next ~ token ~ is ~ a ~ digit: ~ }
   { Next ~ token ~ is ~ not ~ a ~ digit: ~ }
 }
\ExplSyntaxOff

\begin{document}
\checkfordigit 1 \par
\checkfordigit 2 \par
\checkfordigit A \par 
\checkfordigit -- \par
\end{document}

如果您不介意的话,\checkfordigit{1}您可以用 来定义它\tl_set:Nn \l_tmpa_tl {#1} \tl_case:NnTF \l_tmpa_tl { .. } { .. } { .. }

答案3

的想法\peek_regex:NTF很好,但是它有一个问题:\token_to_meaning:N \l_peek_token当以下标记是时,0的扩展是

the character 0

所以在你的情况下

\mh_peek_regex:nTF { a } { true } { false } 0

将返回true,因为a匹配the character 0

如果你限制自己寻找字符而不是其他标记,那么这个想法就可以奏效,仍然允许第一个参数中的范围:

\documentclass{scrartcl}
\usepackage{expl3}
\usepackage{l3regex}
\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_match:nnTF { nV }
\tl_new:N \l__mh_char_peek_tl

\cs_new_protected:Npn \mh_char_peek:nTF #1 #2 #3
 {
  \peek_catcode:NTF ##
   { #3 }
   {
    \tl_set:Nx \l__mh_char_peek_tl { \token_to_meaning:N \l_peek_token }
    \regex_match:nVTF { \A the } \l__mh_char_peek_tl
     {
      \regex_replace_once:nnN { \A the \s .* \s } { } \l__mh_char_peek_tl
      \regex_match:nVTF {#1} \l__mh_char_peek_tl {#2} {#3}
     }
     { #3 }
   }
 }

\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 1 \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 2 \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } ( \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } {1} ~ (group) \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } - \par
\mh_char_peek:nTF { a } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } 0 \par
\mh_char_peek:nTF { [a-z] } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } a \par

\end{document}

我检查的扩展是否\token_to_meaning:N \l_peek_token以和开头the,在这种情况下,我知道它要么是the character <?>,要么the letter <?>是,所以我可以从该扩展中删除不需要的标记并进行正确的检查。

在此处输入图片描述

可以使用适当的功能继续进行其他标记的测试\peek_...:NTF

相关内容