Tutorial für reguläre Ausdrücke in expl3, spezielle Frage zum Löschen von nicht numerischen Zeichen aus Zeichenfolgen

Tutorial für reguläre Ausdrücke in expl3, spezielle Frage zum Löschen von nicht numerischen Zeichen aus Zeichenfolgen

Frage: Löschen Sie aus einer Zeichenfolge mit normalen Textzeichen alles, was keine Ziffern sind. Speichern Sie es als Makro zur weiteren Verarbeitung. Die verbleibenden Ziffern müssen in der richtigen Reihenfolge geschrieben werden und ihren üblichen Catcode 12 haben.

In der POSIX-Shell mit sedkönnte ich schreiben:

mystring="Special: Five (5) bananas for \$1.50."
justnumerals="$(echo $mystring | sed 's/[^0-9]*//g')"
echo "$justnumerals" # Result: 5150

Das ist Routine für seddie Kommandozeile, aber um es in TeX zu tun... expl3reguläre Ausdrücke sind die Rettung! Leider bin ich nach dem Durchsehen der Datei interface3.pdfin der l3kernelDokumentation verloren. Das Problem ist, dass es eine Interaktion zwischen Escape-Codes gibt und ich, ein bloßer, weinerlicher Benutzer, ihnen nicht folgen kann.

Allgemeiner gefragt: Gibt es irgendwo ein User-Land-Tutorial (und nicht ein Programmierer-Land-Tutorial) für expl3-reguläre Ausdrücke? Ich habe über die allgemeine Internetsuche keins gefunden. Was ich gefunden habe, war mathematikintensiv, abgesehen von einer hilfreichen vorherigen FrageRegulärer Ausdruck mit „expl3“

Hinweis: Ich kompiliere nur mit lualatex, falls das einen Unterschied macht. Aber ich dachte nicht, dass es wichtig wäre, also habe ich diesen Tag für die Frage nicht gesetzt.

Antwort1

Das Äquivalent Ihres sedAufrufs ist eigentlich ziemlich unkompliziert in 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

Die Kategoriecodes Ihrer Ziffern bleiben unverändert. Es wird im Terminal/Protokoll ausgegeben:

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).

Antwort2

Obwohl es sich bei Ihrer Frage um eine expl3-Frage handelt, zeige ich hier dennoch, wie das gewünschte Ergebnis mit einem Token-Zyklus erreicht werden kann.

Die Catcodes der Ziffern bleiben unverändert und das Vorhandensein von Zahlen in Gruppen stellt für deren Extraktion kein Problem dar.

\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}

Bildbeschreibung hier eingeben

Antwort3

Da Sie ohnehin Luatex verwenden, können Sie Lua-Muster verwenden, die Ihrem gewohnten Verhalten näher kommen und wahrscheinlich tausendmal schneller sind als l3regex.

Bildbeschreibung hier eingeben

\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}

verwandte Informationen