編輯:解決方案這下面的問題。
我試圖在文本中直接替換整個單詞,但似乎 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ß.
不匹配。