expl3正規表現のチュートリアル、文字列から数字以外の文字を削除する具体的な質問

expl3正規表現のチュートリアル、文字列から数字以外の文字を削除する具体的な質問

質問: 通常のテキスト文字の文字列が与えられた場合、数字以外のものをすべて削除します。これをマクロとして保存し、さらに処理します。残りの数字は順番に書かれ、通常の 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.pdfl3kernel

もっと一般的に言えば、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}

関連情報