Regex_replace_all de expl3 tiene un problema con el alemán ß, ¿por qué?

Regex_replace_all de expl3 tiene un problema con el alemán ß, ¿por qué?

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_allno 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 \wclase a \Wo al revés.

Pero l3regexactualmente no es compatible con Unicode completo. La clase \wcontiene sólo ascii [A-Za-z0-9\_]. Eso significa que ß(o más precisamente los dos bytes que forman el ß) pertenece \Wy también el período y, por lo tanto, Grieß.no coincide.

información relacionada