¿Cuáles son las reglas de pdftex `\pdfmatch` para la expansión y el uso de clases especiales?

¿Cuáles son las reglas de pdftex `\pdfmatch` para la expansión y el uso de clases especiales?

pdftex tiene un comando que me resulta potencialmente útil para buscar y dividir cadenas: \pdfmatch. Sin embargo, he encontrado pocos ejemplos funcionales en Internet. Ya tengo resuelto el uso básico. Por ejemplo, tomar prestada una expresión regular dehttps://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers, Estas líneas:

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

producir esta salida: 1, 0->-4.06, 1->4

Mi pregunta es: ¿alguien ha descubierto las reglas de expansión \pdfmatchy si puede manejar clases de personajes como [:alnum:]?

Pregunto acerca de las clases de caracteres porque la búsqueda de pdftex supuestamente es compatible con posix. Según esta página, las clases de caracteres están en el estándar posix:https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions. Otras páginas indican que las clases dependen de la configuración regional. No puedo hacer que funcionen \pdfmatchen absoluto y sospecho que no estoy haciendo nada malo; simplemente no son compatibles con pdftex.

Algunos otros descubrimientos que hice están relacionados con la parte de expansión de mi pregunta: ^y $funcionan como anclas sin ningún cambio en sus códigos cat. También descubrí que eso \pdfmatchhace al menos algo de expansión. No se puede utilizar \$como ancla cuando se trata de TeX simple \chardef. Pero si se cambia a \def\${$}(sin lujos palabra por palabra), entonces $y \$se comportará de manera similar.

Lo anterior nos hace preguntarnos si la expansión es completa como an \edefo solo de un nivel como an \ifx, y cuáles de los caracteres especiales de TeX deben escaparse o pasarse como catcode12. Los frenillos, incluso cuando están equilibrados, son especialmente desconcertantes. \strmatchSe agradecerían mucho ejemplos prácticos o reglas.

PD: conozco soluciones de expresiones regulares con luatex. Me pregunto específicamente sobre pdftex. ¡Gracias!

Respuesta1

El código fuente de expresiones regulares en las fuentes pdftex tiene soporte opcional para clases de caracteres, pero no tiene soporte regional, por lo que no se puede utilizar de manera confiable con caracteres que no sean ASCII; cualquier entrada UTF-8 se verá como múltiples bytes, no como caracteres Unicode.

\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

produce

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

donde la prueba 2 muestra [:digit:]no es una clase de personaje sino simplemente ese conjunto de personajes: d i g t

La prueba 3 muestra [[:digit:]]es la clase de personaje (gracias @egreg)

La prueba 4 muestra que tanto la cadena como la expresión regular están completamente expandidas antes de que comience el procesamiento de expresiones regulares.

Las pruebas 5 a 8 con la ficha chardef no ampliable \DOLLARmuestran que si la expansión no consta únicamente de fichas de personajes, nada coincide.

Respuesta2

La sintaxis \pdfmatchse indica en la página 45 del manual (rev. 905)

\pdfmatch [ icase ] [ subcount⟨entero⟩ ]⟨texto general⟩ ⟨texto general⟩ (ampliable)

Dado que ambos argumentos son ⟨texto general⟩, su contenido está sujeto a una expansión total, como ocurre con \message.

Por lo tanto, si necesita escapar de un carácter para crear una expresión regular, digamos \+para que coincida con un literal +, necesita \noexpand\+o [+](consulte el ejemplo a continuación).

Se admiten clases de personajes [:alpha:]y [:digit:]( [:alnum:]con corchetes dobles, por supuesto).

Para hacer coincidir el final de la cadena, simplemente use $, y el comienzo de la cadena es ^.

¿Qué conjunto de caracteres? Recuerde que pdftexes de 8 bits, por lo que la compatibilidad con UTF-8 está fuera de discusión (pero en algunos casos puede funcionar con 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

La consola imprimirá

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

Si utiliza

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

la ⟨regex⟩ puede estar en la sintaxis POSIX estándar. Por ejemplo, el ejemplo 3 anterior puede ser

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

información relacionada