질문: 일반 텍스트 문자열이 주어지면 숫자가 아닌 모든 것을 삭제하세요. 추가 처리를 위해 매크로로 저장하십시오. 나머지 숫자는 순서대로 쓰여야 하며 일반적인 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.pdf
의 파일을 본 후
l3kernel
길을 잃었습니다. 문제는 이스케이프 코드 사이에 상호 작용이 있는데, 단순한 콧물 사용자인 저는 이를 따라갈 수 없다는 것입니다.
보다 일반적으로, 어딘가에 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}