EDITAR:Solución paraesteproblema a continuación.
Estoy intentando tener un reemplazo directo en el texto de palabras completas, pero parece que el uso regex_replace_all
no funciona correctamente ya que no encuentra una palabra que termine en ß.
No quiero usar "s para ßen el texto que se va a sustituir, ¡aunque eso funciona!
Como MWE:
\documentclass{article}
\usepackage[utf8]{inputenc}
\ExplSyntaxOn
\newcommand{\replaceText}[1]{%
\f_replace_text:n { #1 }
}
\tl_new:N \l_replace_text_tl
\tl_new:N \l_replace_a_tl
\tl_new:N \l_replace_b_tl
\cs_new_protected:Npn \f_replace_text:n #1 {%
\tl_set:Nn \l_replace_text_tl { #1 }
\f_replace:
\tl_use:N \l_replace_text_tl
}
\cs_new_protected:Npn \f_replace: {%
%
\tl_set:Nn \l_replace_a_tl { Grieß }
\tl_set:Nn \l_replace_b_tl { Mehl }
\regex_replace_all:nnN { \b\u{l_replace_a_tl}\b } { \u{l_replace_b_tl} } \l_replace_text_tl
%
\tl_set:Nn \l_replace_a_tl { Grießmenge }
\tl_set:Nn \l_replace_b_tl { Mehlmenge }
\regex_replace_all:nnN { \b\u{l_replace_a_tl}\b } { \u{l_replace_b_tl} } \l_replace_text_tl
%
\tl_set:Nn \l_replace_a_tl { some }
\tl_set:Nn \l_replace_b_tl { more }
\regex_replace_all:nnN { \b\u{l_replace_a_tl}\b } { \u{l_replace_b_tl} } \l_replace_text_tl
%
}
\ExplSyntaxOff
\begin{document}
\noindent Writing some text.
\replaceText{Replacing some text.}
\replaceText{Forgetting to replace Grieß.}
\replaceText{But not forgetting to replace Grießmenge.}
\end{document}
Esto produce:
Escribiendo algún texto. Reemplazo de más texto. Olvidándose de reemplazarGrieß. Pero sin olvidar sustituir a Mehlmenge.
Sin embargo, hubiera esperado:
Escribiendo algún texto. Reemplazo de más texto. Olvidándose de reemplazarmehl. Pero sin olvidar sustituir a Mehlmenge.
¿Por qué hace eso y cómo puedo evitar que lo haga? Probé algunas formas de escapar del carácter en la expresión regular pero no pude hacerlo funcionar.
EDITAR: En este caso, las siguientes adiciones hacen que funcione: Reemplazar todas las instancias de ß con sus ligaduras antes de usar los otros comandos de expresiones regulares que luego usan la ligadura "s solamente (dentro de la búsqueda, no necesariamente en el reemplazo) y luego cambiarlas nuevamente en el fin:
\tl_new:N \l_replace_utf_tl
\tl_new:N \l_replace_ligature_tl
\cs_new_protected:Npn \f_replace_text:n #1 {%
\tl_set:Nn \l_replace_text_tl { #1 }
\tl_set:Nn \l_replace_utf_tl { ß }
\tl_set:Nn \l_replace_ligature_tl { "s }
\regex_replace_all:nnN { \u{l_replace_utf_tl} } { \u{l_replace_ligature_tl} } \l_replace_text_tl
\f_replace:
\regex_replace_all:nnN { \u{l_replace_ligature_tl} } { \u{l_replace_utf_tl} } \l_replace_text_tl
\tl_use:N \l_replace_text_tl
}
Respuesta1
El problema es que para una coincidencia tiene que haber un límite de palabra \b
, lo que significa un cambio de \w
clase a \W
o al revés.
Pero l3regex
actualmente no es compatible con Unicode completo. La clase \w
contiene sólo ascii [A-Za-z0-9\_]
. Eso significa que ß
(o más precisamente los dos bytes que forman el ß) pertenece \W
y también el período y, por lo tanto, Grieß.
no coincide.