expl3 정규 표현식에 대한 튜토리얼, 문자열에서 숫자가 아닌 삭제에 대한 특정 질문

expl3 정규 표현식에 대한 튜토리얼, 문자열에서 숫자가 아닌 삭제에 대한 특정 질문

질문: 일반 텍스트 문자열이 주어지면 숫자가 아닌 모든 것을 삭제하세요. 추가 처리를 위해 매크로로 저장하십시오. 나머지 숫자는 순서대로 쓰여야 하며 일반적인 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}

여기에 이미지 설명을 입력하세요

답변3

어쨌든 luatex를 사용하면 익숙한 패턴에 더 가깝고 l3regex보다 수천 배 더 빠른 Lua 패턴을 사용할 수 있습니다.

여기에 이미지 설명을 입력하세요

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

관련 정보