問題:給定一串普通文字字符,刪除所有不是數字的內容。將其儲存為巨集以供進一步處理。其餘數字必須按順序書寫,並且必須具有其常用的類別代碼 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
雖然我意識到你的問題是一個 expl3 問題,但我仍然在這裡展示瞭如何透過令牌循環實現所需的結果。
數字的目錄代碼不變,數字成組的存在對提取它們沒有問題。
\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}