expl3 正規表示式教學課程,從字串中刪除非數字的具體問題

expl3 正規表示式教學課程,從字串中刪除非數字的具體問題

問題:給定一串普通文字字符,刪除所有不是數字的內容。將其儲存為巨集以供進一步處理。其餘數字必須按順序書寫,並且必須具有其常用的類別代碼 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}

在此輸入影像描述

答案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}

相關內容