expl3 正则表达式教程,字符串中非数字删除的具体问题

expl3 正则表达式教程,字符串中非数字删除的具体问题

问题:给定一串普通文本字符,删除所有非数字部分。将其保存为宏以供进一步处理。其余数字必须按顺序书写,并且必须具有其通常的 catcode 12。

在 POSIX shell 中sed,我可以写:

mystring="Special: Five (5) bananas for \$1.50."
justnumerals="$(echo $mystring | sed 's/[^0-9]*//g')"
echo "$justnumerals" # Result: 5150

这对于sed命令行来说是常规操作,但要在 TeX 中执行此操作... expl3正则表达式可以帮上忙!唉,在查看 文档interface3.pdf中的文件后l3kernel,我迷路了。问题是转义码之间存在交互,而我,一个爱哭鼻子的用户,无法理解它们。

更一般地讲,是否有针对 expl3 正则表达式的用户教程(而不是程序员教程)?我通过常规互联网搜索没有找到。我找到的都是数学密集型的,除了一个有用的先前问题使用 `expl3` 的正则表达式

注意:我只用 进行编译lualatex,如果这有区别的话。但我认为这并不重要,所以我没有为这个问题加上那个标签。

答案1

您的通话的等价sed内容实际上非常简单l3regex

\ExplSyntaxOn
\tl_new:N \l_rallg_mystring_tl
\tl_set:Nn \l_rallg_mystring_tl { Special:~ Five~ (5)~ bananas~ for~ \$1.50. }
\regex_replace_all:nnN { [^0-9] } {} \l_rallg_mystring_tl
\tl_analysis_show:N \l_rallg_mystring_tl
\stop

数字的类别代码将保持不变。它将打印到终端/日志中:

The token list \l_rallg_mystring_tl contains the tokens:
>  5 (the character 5)
>  1 (the character 1)
>  5 (the character 5)
>  0 (the character 0).

答案2

虽然我知道你的问题是一个解释性问题,但我仍然在这里展示了如何通过令牌循环实现所需的结果。

数字的 Catcode 保持不变,并且成组的数字的存在不会对提取它们造成任何问题。

\documentclass{article}
\usepackage{tokcycle}
\stripgroupingtrue% STRIPS cat-1,2 BRACES FROM OUTPUT
\tokcycleenvironment\justnumerals
  {\ifnum`##1>`/ \ifnum`##1<`:\addcytoks{##1}\fi\fi}% SEEKS NUMBER CHARS ONLY
  {\processtoks{##1}}% PROCESSES GROUP CONTENT
  {}% STRIPS MACROS
  {}% STRIPS SPACES
\begin{document}
\def\mystring{Special: Five (5) bananas for \$1.50. 
  \textit{Numbers 2 and 4 in a group} Täüt}
\expandafter\justnumerals\mystring\endjustnumerals

Confirm braces stripped: \detokenize\expandafter{\the\cytoks}
\end{document}

在此处输入图片描述

答案3

由于您正在使用 luatex,因此您可以使用更接近您习惯的 Lua 模式,并且可能比 l3regex 快数千倍。

在此处输入图片描述

\documentclass{article}

\makeatletter
\def\foo#1{\directlua{%
    tex.print(string.gsub([[\detokenize{#1}]],"[^\@percentchar d]","") .. "")}}
\makeatother

\begin{document}

\foo{Special: Five (5) bananas for \$1.50.}

\end{document}

相关内容