expl3 的 regex_replace_all 对德语 ß 有问题,为什么?

expl3 的 regex_replace_all 对德语 ß 有问题,为什么?

编辑:解决方案下面的问题。

我正在尝试在文本中直接替换整个单词,但似乎使用regex_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\b变为或反之亦然。\w\W

l3regex目前不支持完整的unicode。该类\w仅包含ascii [A-Za-z0-9\_]。这意味着ß(或更准确地说,构成ß的两个字节)属于\W,句点也属于,因此Grieß.不匹配。

相关内容