正则表达式中 \cB. 和 \cB\{ 有什么区别?

正则表达式中 \cB. 和 \cB\{ 有什么区别?

所有内容都在标题中。我想知道这两个表达式\cB.\CB\{ 正则表达式 (regex) 之间的区别。

在下面的例子中,似乎两者都给出了相同的结果。此外,可以混合使用它们,即可以使用\cB\{ ... \cE.

\documentclass{article}
\ExplSyntaxOn
\tl_new:N  \l_my_tl
\NewDocumentCommand{\emphasizing}{ mm }
 {
  \tl_set:Nn \l_my_tl { #2 }
  \regex_replace_all:nnN { (\s) (#1) (\s) } { \1 \c{emph}\cB\{ \2 \cE\} \3 } \l_my_tl
  \tl_use:N \l_my_tl
 }
\ExplSyntaxOff
\begin{document}
What is the difference \emphasizing{my}{in my question} what is the difference 
\end{document}

答案1

在搜索表达式中没有很大的区别,在替换表达式中有很大区别,但大多没有影响。

在搜索表达式中,.代表“任何字符”(对于 TeX 而言是任何标记),而在替换表达式中则.代表字符本身。TeX 的正则表达式已扩展为允许使用“前缀”来说明字符应具有的类别代码。因此通常\cP?不会匹配?具有类别代码 12 的标准,而 则\cP表示“类别代码 6”(“参数”的助记符)。其余部分,语法基本与 POSIX 正则表达式相同。

如果你\tl_analysis_show:N \l_my_tl在代码中添加 替换\cE.\cE\{你就会进入终端

The token list \l_my_tl contains the tokens:
>  i (the letter i)
>  n (the letter n)
>    (blank space  )
>  \emph (control sequence=macro:->\protect \emph  )
>  { (begin-group character {)
>  m (the letter m)
>  y (the letter y)
>  . (end-group character .)
>    (blank space  )
>  q (the letter q)
>  u (the letter u)
>  e (the letter e)
>  s (the letter s)
>  t (the letter t)
>  i (the letter i)
>  o (the letter o)
>  n (the letter n).

重要的是

>  . (end-group character .)

这说明您插入的.是类别代码 2,而不是。这不会造成损害,因为类别代码 2 字符的作用相同。类别代码 1 字符的作用并不完全相同,因为当使用}特殊语法时,它们可以用作分隔参数的分隔符。\def\macro<tokens>#{...}

在搜索表达式中,\cB.将匹配任何类别代码 1 的字符,而\cB\{仅匹配{1。 没什么大不了的,因为在正常设置中只有一个这样的字符,即左括号,类别代码 2 也是如此。 但在非常特殊的情况下,事态会发生变化(想想 的fancyvrb选项commandchars)。

最好坚持标准并在替换表达式中使用\cB\{和,除非您正在处理一种特殊情况,即您想要更改和\cE\}的类别代码,但您仍然有一些可以作为参数的组分隔符的东西。{}

请注意,使用\cB.\cE.仍然有效,因为一旦字符获得附加的类别代码,它就是永久的。然而,在检查结果标记列表时,这会非常令人困惑。

答案2

大多数情况下差别不大。作为用户,您通常不关心哪个字符具有 catcode 1 或 2,因为它们从未排版过(好吧,您关心是因为您必须编写它们,但仅此而已)。具有 catcode 1 和 2 的字符仅由 TeX 用于形成组、分隔参数和此类事物,但字符本身大多数时候都会消失,因此实际字符并不重要,例如:

\catcode`\(=1 \catcode`\)=2
\documentclass(article)
\ExplSyntaxOn
\tl_new:N  \l_my_tl
\NewDocumentCommand(\emphasizing)( mm )
 (
  \tl_set:Nn \l_my_tl ( #2 )
  \regex_replace_all:nnN ( (\s) (#1) (\s) ) ( \1 \c{emph}\cB\{ \2 \cE\} \3 ) \l_my_tl
  \tl_use:N \l_my_tl
 )
\ExplSyntaxOff
\begin{document)
What is the difference \emphasizing(my)(in my question) what is the difference
\end(document}

(请注意,您甚至可以将它们混合在一起,就像我在\begin{document)\end(document}上面所做的那样。)

你会注意到其中的区别(我可能遗漏了一些情况,但这些是主要的):

  • 当您使用\detokenize字符:时,开始组和结束组标记将成为要排版的普通字符标记,然后您将看到差异(如果您使用\string或,则是一样的\meaning);

  • 当您使用{-delimited 命令时:例如\textcolor定义为\protected\def\textcolor#1#{\@textcolor{#1}}(请注意#{定义中的)。在这种情况下,该命令仅在由相同的 catcode-1 字符分隔时才有效:

    \catcode`\(=1 \catcode`\)=2
    \documentclass(article)
    \usepackage(color)
    \begin(document)
      \textcolor{red}(hello) % works
    % \textcolor(red)(hello) % doesn't work
    \end(document)
    
  • 当您使用\show或调试代码时\tracingall:您的眼睛已经习惯了{}意味着开始和结束组标记,这\emph.word}看起来完全是错误的(即使 TeX 能理解它)。

相关内容