source

Regex: InCombining Diacricic Marks란?

bestscript 2022. 11. 2. 22:44

Regex: InCombining Diacricic Marks란?

다음 코드는 악센트 문자를 일반 텍스트로 변환하는 것으로 잘 알려져 있습니다.

Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

'수제' 방식을 이 방법으로 대체했습니다만, replaceAll의 'regex' 부분을 이해해 둘 필요가 있습니다.

1) "InCombining Diacritical Marks"란 무엇입니까?
2) 그 문서는 어디에 있습니까? (및 직유기)

감사해요.

\p{InCombiningDiacriticalMarks}는 Unicode 블록 속성입니다.JDK7에서는 2부 표기법을 사용하여 쓸 수 있습니다.\p{Block=CombiningDiacriticalMarks}독자들에게는 더 명확할 수 있습니다.UAX#44: "Unicode 문자 데이터베이스"에 설명되어 있습니다.

즉, 코드 포인트는 특정 범위, 즉 블록 내에 있으며, 이 블록은 해당 이름을 가진 물건에 사용하도록 할당되어 있습니다.이는 잘못된 접근법입니다.그 범위 내의 코드 포인트가 특별한 것인지 아닌지를 보증할 수 없고, 그 블록 외부의 코드 포인트가 본질적으로 같은 문자가 아니라는 보증도 없기 때문입니다.

예를 들어, Latin Letters는\p{Latin_1_Supplement}블록, 예를 들어 é, U+00E9.하지만, 그곳에도 라틴 문자가 아닌 것들이 있습니다.그리고 물론 곳곳에 라틴 문자도 있다.

블록은 당신이 원하는 것이 거의 아니다.

이 경우, 저는 당신이 그 부동산을 사용하고 싶어할 것이라고 생각합니다.\p{Mn}, a.k.a.,\p{Nonspacing_Mark}Combining_Diacriticals 블록의 모든 코드 포인트는 그런 종류입니다.또한 (Unicode 6.0.0 현재) 1087 Non-pacing_Marks는 해당 블록에 포함되지 않습니다.

그것은 거의 체크하는 것과 같다.\p{Bidi_Class=Nonspacing_Mark}그 그룹에는 동봉 마크도 포함되어 있기 때문에, 전부는 아닙니다.\p{Me}둘 다 원한다면 이렇게 말할 수 있어요.[\p{Mn}\p{Me}]기본 Java regex 엔진을 사용하는 경우 General_Category 속성에만 액세스할 수 있습니다.

JNI를 사용하여 ICU C++ regex 라이브러리에 접속해야 합니다.Google이 접속하는 방법처럼\p{BC=NSM}현재 ICU와 Perl만이 모든 Unicode 속성에 액세스할 수 있기 때문입니다.일반 Java regex 라이브러리는 몇 가지 표준 Unicode 속성만 지원합니다.그러나 JDK7에서는 Unicode Script 속성이 지원되며 이는 Block 속성보다 훨씬 선호됩니다.따라서 JDK7에서 쓸 수 있습니다.\p{Script=Latin} ★★★★★★★★★★★★★★★★★」\p{SC=Latin}의 숏컷을 지정합니다\p{Latin}, 라틴어 스크립트의 임의의 문자를 취득합니다.이것은 매우 일반적으로 필요한 으로 이어진다.[\p{Latin}\p{Common}\p{Inherited}].

그렇다고 해서 모든 문자에서 "accent" 표시가 제거되는 것은 아닙니다.그것은 이것을 하지 않을 많은 것들이 있다.예를 들어, D를 D로 변환하거나 öo로 변환할 수 없습니다.이를 위해서는 코드 포인트를 Unicode 대조 테이블의 동일한 프라이머리 대조 강도와 일치하는 것으로 줄여야 합니다.

또 다른 장소에서는\p{Mn} 것이다.\p{Me} 「 」, 「 」도 .\p{Diacritic}여기에는 지원이 Perl중 하나의 합니다.안타깝게도 여기에는 완전한 속성 지원이 필요합니다.ICU의 Perl의 JNI의 JNI의 JNI입니다.자바에는 유니코드 지원 문제가 많습니다.

잠깐, 포르투갈 사람이군요.포르투갈어 텍스트만 취급한다면 전혀 문제가 없을 것입니다.

하지만, 정말로 억양을 없애고 싶은 것이 아니라, 「인시티브하게」 매치할 수 있는 것을 원하는 것이겠지요?이 경우 ICU4J(Java용 ICU) 콜레이터 클래스를 사용하여 실행할 수 있습니다.1차적인 강도로 비교하면 악센트는 반영되지 않습니다.저는 스페인어 텍스트를 자주 처리하기 때문에 항상 이렇게 합니다.여기 어딘가에 앉아 있는 스페인 사람들을 위해 어떻게 하는지 예를 들어볼게요.

시간이 좀 걸렸지만, 다 알아냈어요.

여기 '일반' 범위에서 바이패스된 문자를 포함하여 모든 잘고 문자를 포함해야 하는 정규식이 있습니다.

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62])

이것으로 시간을 절약하시길 바랍니다.

언급URL : https://stackoverflow.com/questions/5697171/regex-what-is-incombiningdiacriticalmarks