BEARBEITEN:Lösung fürDasProblem unten.
Ich versuche, ganze Wörter direkt im Text zu ersetzen, aber anscheinend regex_replace_all
funktioniert 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 \W
oder umgekehrt.
Unterstützt derzeit aber l3regex
kein vollständiges Unicode. Die Klasse \w
enthält nur ASCII [A-Za-z0-9\_]
. Das bedeutet, dass das ß
(oder genauer gesagt die beiden Bytes, die das ß bilden) zu gehört, \W
ebenso wie der Punkt, und daher Grieß.
nicht übereinstimmt.