특수 클래스의 확장 및 사용에 대한 pdftex `\pdfmatch` 규칙은 무엇입니까?

특수 클래스의 확장 및 사용에 대한 pdftex `\pdfmatch` 규칙은 무엇입니까?

pdftex에는 문자열 검색 및 분할에 잠재적으로 유용한 명령이 있습니다 \pdfmatch. 그러나 인터넷에서 실제 사례를 거의 발견하지 못했습니다. 기본적인 사용법은 알아봤습니다. 예를 들어, 다음에서 정규식을 빌리면https://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers, 다음 줄은 다음과 같습니다.

\count255=\pdfmatch {[+-]?([0-9]*[.])?[0-9]+} {-4.06}
\message{\number\count255, \pdflastmatch0, \pdflastmatch1}
\end

다음 출력을 생성합니다. 1, 0->-4.06, 1->4

내 질문은 다음과 같습니다. 확장 규칙을 알아낸 사람이 있고 다음 \pdfmatch과 같은 문자 클래스를 처리할 수 있는지 여부가 있습니까 [:alnum:]?

pdftex의 검색이 posix와 호환 가능하다고 가정되어 문자 클래스에 대해 묻습니다. 이 페이지에 따르면 문자 클래스는 posix 표준에 있습니다.https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions. 다른 페이지에서는 클래스가 로케일에 따라 다르다는 것을 나타냅니다. 나는 그것들을 전혀 사용할 수 없으며 \pdfmatch내가 잘못한 것이 없다고 생각합니다. pdftex에서는 지원되지 않습니다.

내 질문의 확장 부분과 관련하여 내가 만든 몇 가지 다른 발견은 Catcode를 변경하지 않고 앵커로 작동하는 것입니다 ^. $나는 또한 그것이 \pdfmatch적어도 어느 정도 확장을 한다는 것을 발견했습니다. \$일반 TeX 에서 오는 경우 앵커로 사용할 수 없습니다 \chardef. 그러나 \def\${$}(멋진 말 그대로) 로 변경되면 유사하게 $동작 \$합니다.

\edef위의 내용은 확장이 an 처럼 가득 찬 것인지 아니면 와 같은 한 수준만 있는지 \ifx, 그리고 TeX의 특수 문자 중 어떤 문자를 이스케이프하거나 catcode12로 전달해야 하는지 궁금하게 만듭니다 . 교정기는 균형이 잡혀 있을 때에도 특히 혼란스럽습니다. 또는 규칙 의 실제 사례를 \strmatch가장 높이 평가할 것입니다.

PS 저는 luatex를 사용한 정규식 솔루션을 알고 있습니다. 특히 제가 궁금한 것은 pdftex입니다. 감사해요!

답변1

pdftex 소스의 정규식 소스 코드에는 문자 클래스에 대한 일부 선택적 지원이 있지만 로케일 지원이 없으므로 ASCII가 아닌 문자에서는 안정적으로 사용할 수 없습니다. UTF-8 입력은 유니코드 문자가 아닌 여러 바이트로 표시됩니다.

\pdfmatch {[+-]?([0-9]*[.])?[0-9]+} {-4.06}
\immediate\write500{1: \pdflastmatch0, \pdflastmatch1}

% [:digit:] is [:digt]  checking for those literal characters
\pdfmatch {[+-]?([:digit:]*[.])?[:digit:]+} {-dddg:ii.ggg}
\immediate\write500{2: \pdflastmatch0, \pdflastmatch1}

% [[:digit:]] is digit class
\pdfmatch {[+-]?([[:digit:]]*[.])?[[:digit:]]+} {-4.06}
\immediate\write500{3: \pdflastmatch0, \pdflastmatch1}

% full expansion happens for both arguments before regex processing
\def\aaa{[0-9]*[.]}
\def\bbb{[+-]?(\aaa)?}
\def\ccc{\bbb[0-9]+}

\def\DDD{4}
\def\EEE{06}
\def\FFF{-\DDD.\EEE}

\pdfmatch {\ccc} {\FFF}
\immediate\write500{4: \pdflastmatch0, \pdflastmatch1}

\chardef\DOLLAR=`$

\pdfmatch {\DOLLAR} {\$}
\immediate\write500{5: \pdflastmatch0}

\pdfmatch {\DOLLAR} {.D.*R}
\immediate\write500{6: \pdflastmatch0}


\pdfmatch {\DOLLAR} {.*}
\immediate\write500{7: \pdflastmatch0}


\pdfmatch {abc\DOLLAR} {a.*}
\immediate\write500{8: \pdflastmatch0}


\end

생산하다

1: 0->-4.06, 1->4.
2: 0->-dddg:ii.ggg, 1->dddg:ii.
3: 0->-4.06, 1->4.
4: 0->-4.06, 1->4.
5: -1->
6: -1->
7: -1->
8: -1->

테스트 2에서 보여주는 [:digit:]것은 문자 클래스가 아니라 단순히 해당 문자 집합입니다.: d i g t

테스트 3에서는 [[:digit:]]문자 클래스를 보여줍니다(@egreg에게 감사드립니다).

테스트 4에서는 정규식 처리가 시작되기 전에 문자열과 정규식이 모두 완전히 확장되는 것을 보여줍니다.

확장 불가능한 chardef 토큰을 사용한 테스트 5-8은 \DOLLAR확장이 순전히 문자 토큰으로 구성되지 않은 경우 일치하는 항목이 없음을 보여줍니다.

답변2

의 구문은 \pdfmatch매뉴얼(rev. 905)의 45페이지에 명시되어 있습니다.

\pdfmatch [ icase ] [ subcount⟨정수⟩ ]⟨일반 텍스트⟩ ⟨일반 텍스트⟩ (확장 가능)

두 인수 모두 ⟨일반 텍스트⟩이므로 해당 내용은 에서 발생하는 것과 같이 완전히 확장될 수 있습니다 \message.

따라서 정규식을 만들기 위해 문자를 이스케이프해야 하는 경우(예: \+리터럴 일치) , or가 +필요합니다 (아래 예 참조).\noexpand\+[+]

문자 클래스 [:alpha:], [:digit:][:alnum:]가 지원됩니다(물론 이중 괄호 사용).

문자열의 끝을 일치시키려면 을 사용 $하고 문자열의 시작은 입니다 ^.

어떤 캐릭터 세트인가요? 8비트 이므로 pdftexUTF-8 지원은 불가능합니다(그러나 어떤 경우에는 에서 작동할 수 있음 pdflatex).

\documentclass{article}

\count255=\pdfmatch{[[:digit:]]x}{1x2y}
\message{^^J1: \the\count255; \pdflastmatch0}

\count255=\pdfmatch{[[:digit:]][[:alpha:]]}{12y}
\message{^^J2: \the\count255; \pdflastmatch0}

\count255=\pdfmatch{[[:alnum:]]*\noexpand\+}{a2c+d3f+}
\message{^^J3: \the\count255; \pdflastmatch0}

\count255=\pdfmatch{[[:alnum:]]*[+]$}{a2c+d3f+}
\message{^^J4: \the\count255; \pdflastmatch0}

\count255=\pdfmatch{^[[:alnum:]]*\noexpand\+}{a2c+d3f+}
\message{^^J5: \the\count255; \pdflastmatch0}

\count255=\pdfmatch{à}{aàa}
\message{^^J6: \the\count255; \pdflastmatch0}

\stop

콘솔이 인쇄됩니다

1: 1; 0->1x
2: 1; 1->2y
3: 1; 0->a2c+
4: 1; 4->d3f+
5: 1; 0->a2c+
6: 1; 1->à

당신이 사용하는 경우

\pdfmatch{\unexpanded{<regex>}}{<text>}

⟨regex⟩는 표준 POSIX 구문일 수 있습니다. 예를 들어, 위의 예 3은 다음과 같습니다.

\count255=\pdfmatch{\unexpanded{[[:alnum:]]*\+}}{a2c+d3f+}

관련 정보