expl3s regex_replace_all hat ein Problem mit dem deutschen ß, warum?

expl3s regex_replace_all hat ein Problem mit dem deutschen ß, warum?

BEARBEITEN:Lösung fürDasProblem unten.

Ich versuche, ganze Wörter direkt im Text zu ersetzen, aber anscheinend regex_replace_allfunktioniert dies nicht richtig, da kein Wort gefunden wird, das auf ß endet.

Ich möchte kein "s für ß verwendenim zu ersetzenden Text selbst, obwohl das funktioniert!

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

Das Ergebnis:

Einen Text schreiben. Mehr Text ersetzen. Vergessen, zu ersetzenGrießAber nicht vergessen, die Mehlmenge zu ersetzen.

Ich hätte jedoch erwartet:

Einen Text schreiben. Mehr Text ersetzen. Vergessen, zu ersetzenMehlAber nicht vergessen, die Mehlmenge zu ersetzen.

Warum passiert das und wie kann ich das verhindern? Ich habe einige Möglichkeiten ausprobiert, das Zeichen im regulären Ausdruck zu maskieren, aber es hat nicht funktioniert.

BEARBEITEN: In diesem Fall, die folgenden Ergänzungen bringen es zum Laufen: Ersetzen Sie alle Vorkommen von ß durch seine Ligatur "s, bevor Sie die anderen Regex-Befehle verwenden, die dann nur die Ligatur "s verwenden (innerhalb der Suche, nicht unbedingt beim Ersetzen) und ändern Sie sie dann am Ende wieder zurück:

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

Antwort1

Das Problem besteht darin, dass für einen Match eine Wortgrenze vorliegen muss \b, also ein Wechsel von der \w-Klasse in \Woder umgekehrt.

Unterstützt derzeit aber l3regexkein vollständiges Unicode. Die Klasse \wenthält nur ASCII [A-Za-z0-9\_]. Das bedeutet, dass das ß(oder genauer gesagt die beiden Bytes, die das ß bilden) zu gehört, \Webenso wie der Punkt, und daher Grieß.nicht übereinstimmt.

verwandte Informationen