
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 sed
na linha de comando, mas para fazer isso dentro do TeX...
expl3
expressões regulares para o resgate! Infelizmente, depois de olhar o arquivo
interface3.pdf
na l3kernel
documentaçã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 sed
chamada é 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}
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.
\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}