Tutorial para expresiones regulares expl3, pregunta específica para eliminación no numérica de una cadena

Tutorial para expresiones regulares expl3, pregunta específica para eliminación no numérica de una cadena

Pregunta: Dada una cadena de caracteres de texto ordinarios, elimine todo lo que no sea un número. Guárdelo como una macro para su posterior procesamiento. Los números restantes deben estar escritos en orden y deben tener su código de gato habitual 12.

En el shell POSIX con sed, podría escribir:

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

Esto es una rutina seden la línea de comando, pero para hacerlo dentro de TeX... ¡ expl3expresiones regulares al rescate! Por desgracia, después de mirar el archivo interface3.pdfen la l3kerneldocumentación, estoy perdido. El problema es que existe una interacción entre los códigos de escape y yo, un simple usuario llorón, no puedo seguirlos.

De manera más general, ¿existe un tutorial para el usuario (en lugar de un tutorial para el programador) para expresiones regulares expl3 en alguna parte? No encontré ninguno mediante una búsqueda general en Internet. Lo que encontré fue intensivo en matemáticas, excepto por una pregunta anterior útil.Expresión regular usando `expl3`

Nota: Compilo sólo con lualatex, si eso hace la diferencia. Pero no pensé que importara, así que no puse esa etiqueta para la pregunta.

Respuesta1

El equivalente de su sedllamada es bastante sencillo en 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

Los códigos de categoría de sus números no se modificarán. Se imprimirá en la terminal/registro:

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

Respuesta2

Si bien me doy cuenta de que su pregunta es una pregunta explicativa, muestro aquí cómo se puede lograr el resultado deseado con un ciclo simbólico.

Los catcodes de los números no cambian y la presencia de números en grupos no supone ningún problema para extraerlos.

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

ingrese la descripción de la imagen aquí

Respuesta3

Como de todos modos estás usando luatex, puedes usar patrones de Lua que se acerquen más a lo que estás acostumbrado y probablemente miles de veces más rápidos que l3regex.

ingrese la descripción de la imagen aquí

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

información relacionada