Tutorial para expressões regulares expl3, questão específica para exclusão não numérica de string

Tutorial para expressões regulares expl3, questão específica para exclusão não numérica de string

Pergunta: Dada uma sequência de caracteres de texto comuns, exclua tudo que não seja um numeral. Salve-o como uma macro para processamento posterior. Os restantes numerais devem estar escritos por ordem e devem ter o seu catcode habitual 12.

No shell POSIX com sed, eu poderia escrever:

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

Isso é rotina sedna linha de comando, mas para fazer isso dentro do TeX... expl3expressões regulares para o resgate! Infelizmente, depois de olhar o arquivo interface3.pdfna l3kerneldocumentação, estou perdido. O problema é que existe uma interação entre os códigos de escape, e eu, mero usuário chorão, não consigo segui-los.

De maneira mais geral, existe um tutorial do usuário (em vez de um tutorial do programador) para expressões regulares expl3 em algum lugar? Não encontrei nenhum através da pesquisa geral na Internet. O que descobri foi intensivo em matemática, exceto por uma pergunta anterior útilExpressão regular usando `expl3`

Obs: compilo apenas com lualatex, se isso fizer diferença. Mas não achei que isso importasse, então não coloquei essa tag na pergunta.

Responder1

O equivalente à sua sedchamada é bastante simples em 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

Os códigos de categoria dos seus numerais permanecerão inalterados. Ele será impresso no terminal/log:

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

Responder2

Embora eu perceba que sua pergunta é expl3, ainda assim mostro aqui como o resultado desejado pode ser alcançado com um ciclo de token.

Os códigos catódicos dos numerais permanecem inalterados e a presença de números em grupos não representa nenhum problema para extraí-los.

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

insira a descrição da imagem aqui

Responder3

De qualquer forma, como você está usando luatex, você pode usar padrões Lua mais próximos do que você está acostumado e provavelmente milhares de vezes mais rápidos que l3regex.

insira a descrição da imagem aqui

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

informação relacionada