\p{InCombiningDiacriticalMarks}
Unicodeブロックプロパティです。JDK7では、2つの部分からなる表記を使用して記述できるようになります\p{Block=CombiningDiacriticalMarks}
。これは、読者にとってより明確な場合があります。これは、UAX#44「Unicode文字データベース」に記載されています。
これは、コードポイントが、その名前で使用するために割り当てられた特定の範囲、つまりブロック内にあることを意味します。これは悪いアプローチです。その範囲内のコードポイントが特定のものであるかどうか、またはそのブロックの外側のコードポイントが本質的に同じ文字ではないという保証がないためです。
たとえば、\p{Latin_1_Supplement}
ブロックには、é、U + 00E9などのラテン文字があります。ただし、そこにはラテン文字ではないものもあります。そしてもちろん、至る所にラテン文字もあります。
ブロックはほとんどあなたが望むものではありません。
この場合、プロパティ\p{Mn}
、別名を使用することをお勧めします\p{Nonspacing_Mark}
。Combining_Diacriticalsブロック内のすべてのコードポイントはそのようなものです。(Unicode 6.0.0以降)そのブロックにない1087Nonspacing_Marksもあります。
これは、のチェックとほぼ同じですが\p{Bidi_Class=Nonspacing_Mark}
、そのグループには囲みマークも含まれているため、完全ではありません\p{Me}
。両方が必要な[\p{Mn}\p{Me}]
場合は、デフォルトのJava正規表現エンジンを使用しているかどうかを判断できます。これは、General_Categoryプロパティへのアクセスのみを提供するためです。
\p{BC=NSM}
現在、ICUとPerlのみがすべてのUnicodeプロパティへのアクセスを許可しているため、Googleが行う方法でICU C ++正規表現ライブラリにアクセスするにはJNIを使用する必要があります。通常のJava正規表現ライブラリは、いくつかの標準Unicodeプロパティのみをサポートします。JDK7であってもなりますちょうど約無限に好適なブロックプロパティにあるのUnicodeスクリプトproperyをサポートすること。したがって、JDK7で、\p{Script=Latin}
または \p{SC=Latin}
、またはショートカットを記述\p{Latin}
して、ラテン文字から任意の文字を取得できます。これは、非常に一般的に必要とされるにつながります[\p{Latin}\p{Common}\p{Inherited}]
。
すべての文字から「アクセント」マークと思われるものが削除されるわけではないことに注意してください。これを行わないものはたくさんあります。たとえば、ĐをDに、øをoにそのように変換することはできません。そのためには、コードポイントをUnicode照合テーブルの同じプライマリ照合強度に一致するものに減らす必要があります。
\p{Mn}
物事が失敗する別の場所は、もちろん\p{Me}
、のようなマークを囲むことですが、マーク\p{Diacritic}
ではない文字もあります。残念ながら、そのための完全なプロパティサポートが必要です。つまり、JNIからICUまたはPerlへのサポートが必要です。JavaにはUnicodeのサポートに関して多くの問題があります、私は恐れています。
ちょっと待って、あなたはポルトガル人だと思います。ポルトガル語のテキストのみを扱っている場合は、まったく問題はありません。
しかし、あなたは本当にアクセントを削除したくないのではないでしょうか。むしろ、「アクセントに影響されない」ものに一致させたいのですよね?その場合は、ICU4J(ICU for Java)コレータークラスを使用してこれを行うことができます。一次強度で比較すると、アクセント記号はカウントされません。私はスペイン語のテキストを頻繁に処理するため、これを常に行っています。必要に応じて、このあたりに座っているスペイン人のためにこれを行う方法の例があります。