expl3 的 regex_replace_all 對德文 ß 有問題,為什麼?

expl3 的 regex_replace_all 對德文 ß 有問題,為什麼?

編輯:解決方案下面的問題。

我試圖在文本中直接替換整個單詞,但似乎 usingregex_replace_all無法正常工作,因為它找不到以 ß 結尾的單字。

我不想用“s 代表 ß在要替換的文字中,雖然這有效!

身為 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}

這會產生:

寫一些文字。替換更多文字。忘記更換格里斯。但不要忘記替換梅爾蒙格。

然而,我本來期望:

寫一些文字。替換更多文字。忘記更換梅爾。但不要忘記替換梅爾蒙格。

為什麼會這樣做?我嘗試了一些轉義正則表達式中的字元的方法,但我無法讓它發揮作用。

編輯: 在這種情況下,以下新增使其運作:在使用其他正規表示式指令之前,將ß 的所有實例替換為其連字"s,然後僅使用"s 連字(在搜尋內,不一定在替換中),然後將它們更改回結束:

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

答案1

問題是,對於匹配,必須有一個單字邊界,這意味著從-class 到 -class 的\b更改,或反之亦然。\w\W

l3regex目前不支援完整的 unicode。此類別\w僅包含 ascii [A-Za-z0-9\_]。這意味著ß(或更準確地說,建構 ß 的兩個位元組)屬於\W句點,因此Grieß.不匹配。

相關內容