编辑:解决方案这下面的问题。
我正在尝试在文本中直接替换整个单词,但似乎使用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ß.
不匹配。