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