편집하다:솔루션이것아래 문제.
전체 단어를 텍스트 내에서 직접 바꾸려고 하는데 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
현재 전체 유니코드를 지원하지 않습니다. 클래스에는 \w
ascii만 포함되어 있습니다 [A-Za-z0-9\_]
. 이는 ß
(또는 더 정확하게는 ß를 구성하는 2바이트)가 속하고 \W
마침표도 마찬가지이므로 Grieß.
일치하지 않는다는 것을 의미합니다 .