質問: 通常のテキスト文字の文字列が与えられた場合、数字以外のものをすべて削除します。これをマクロとして保存し、さらに処理します。残りの数字は順番に書かれ、通常の catcode 12 を持つ必要があります。
POSIX シェルでは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 の質問であることは承知していますが、それでもトークン サイクルを使用して目的の結果を達成する方法をここで示します。
数字の 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}