expl3의 regex_replace_all에 독일어 ß에 문제가 있습니다. 이유는 무엇입니까?

expl3의 regex_replace_all에 독일어 ß에 문제가 있습니다. 이유는 무엇입니까?

편집하다:솔루션이것아래 문제.

전체 단어를 텍스트 내에서 직접 바꾸려고 하는데 regex_replace_allß로 끝나는 단어를 찾지 못해서 using이 제대로 작동하지 않는 것 같습니다.

ß에 "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}

이는 다음을 생성합니다.

텍스트를 작성 중입니다. 더 많은 텍스트를 교체합니다. 교체하는 것을 잊어버림그리스. 그러나 Mehlmenge를 교체하는 것을 잊지 마십시오.

그러나 나는 다음을 기대했을 것입니다.

텍스트를 작성 중입니다. 더 많은 텍스트를 교체합니다. 교체하는 것을 잊어버림. 그러나 Mehlmenge를 교체하는 것을 잊지 마십시오.

왜 그런 일이 발생하며 어떻게 방지할 수 있나요? 정규식에서 문자를 이스케이프 처리하는 몇 가지 방법을 시도했지만 제대로 작동하지 못했습니다.

편집하다: 이 경우, 다음 추가 사항을 사용하면 작동합니다. "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현재 전체 유니코드를 지원하지 않습니다. 클래스에는 \wascii만 포함되어 있습니다 [A-Za-z0-9\_]. 이는 ß(또는 더 정확하게는 ß를 구성하는 2바이트)가 속하고 \W마침표도 마찬가지이므로 Grieß.일치하지 않는다는 것을 의미합니다 .

관련 정보