\p{InCombiningDiacriticalMarks}
bir Unicode blok özelliğidir. JDK7'de, \p{Block=CombiningDiacriticalMarks}
okuyucu için daha açık olabilecek iki bölümlü notasyonu kullanarak yazabileceksiniz . Burada UAX # 44: "Unicode Karakter Veritabanı" nda belgelenmiştir .
Bunun anlamı, kod noktasının belirli bir aralığa, o ada sahip şeyler için kullanılmak üzere tahsis edilmiş bir blok içinde yer almasıdır. Bu kötü bir yaklaşımdır, çünkü bu aralıktaki kod noktasının belirli bir şey olup olmadığına ya da bu bloğun dışındaki kod noktalarının esasen aynı karakterde olmadığına dair hiçbir garanti yoktur.
Örneğin, \p{Latin_1_Supplement}
blokta é, U + 00E9 gibi Latin harfleri vardır . Ancak orada Latin harfleri olmayan şeyler de var. Ve tabii ki her yerde Latin harfleri de var.
Bloklar neredeyse asla istediğiniz gibi değildir.
Bu durumda, sana özelliğini kullanmak isteyebilirsiniz şüpheli \p{Mn}
aka \p{Nonspacing_Mark}
. Combining_Diacriticals bloğundaki tüm kod noktaları bu türdendir. Ayrıca (Unicode 6.0.0 itibariyle) 1087 Nonspacing_Marks bu blokta yer almıyor .
Bu neredeyse kontrol aynıdır \p{Bidi_Class=Nonspacing_Mark}
, ama tamamen değil, bu grup da kapsayan işaretleri içerdiğinden, \p{Me}
. Her ikisini de istiyorsanız, [\p{Mn}\p{Me}]
yalnızca General_Category özelliğine erişim sağladığı için varsayılan bir Java normal ifade motoru kullanıp kullanmadığınızı söyleyebilirsiniz .
JNI'yi, ICU C ++ regex kitaplığına Google'ın yaptığı gibi bir şeye erişmek için kullanmak zorunda kalacaksınız \p{BC=NSM}
, çünkü şu anda yalnızca ICU ve Perl tüm Unicode özelliklerine erişim sağlıyor . Normal Java regex kitaplığı yalnızca birkaç standart Unicode özelliğini destekler. JDK7'de Unicode Script özelliği için destek olacak , ki bu Block özelliğine neredeyse sonsuz derecede tercih edilebilir. Böylece JDK7 yazma içinde olabilir \p{Script=Latin}
ya da \p{SC=Latin}
, ya da kısa kesilmiş \p{Latin}
, Latin harflerinin herhangi karakterde olsun. Bu, çok ihtiyaç duyulan şeylere yol açar [\p{Latin}\p{Common}\p{Inherited}]
.
Bunun "aksan" işaretleri olarak düşünebileceğiniz şeyleri tüm karakterlerden kaldırmayacağının farkında olun! Bunun için yapmayacağı çok kişi var. Örneğin, dönüştürmek olamaz DJ için D veya ø için o şekilde söyledi. Bunun için, kod noktalarını Unicode Harmanlama Tablosundaki aynı birincil harmanlama gücü ile eşleşenlere indirmeniz gerekir.
Bir \p{Mn}
şeyin başarısız olduğu başka bir yer \p{Me}
, tabii ki, gibi işaretleri içine almaktır, ama aynı zamanda \p{Diacritic}
işaret olmayan karakterler de vardır . Ne yazık ki, bunun için tam mülk desteğine ihtiyacınız var, bu da JNI'yi ICU veya Perl'e ifade ediyor. Java'nın Unicode desteğiyle ilgili pek çok sorunu var, korkarım.
Oh bekle, Portekizlisin görüyorum. Sadece Portekizce metinle uğraşıyorsanız hiçbir sorun yaşamazsınız.
Bununla birlikte, bahse girerim, aksanları gerçekten kaldırmak istemezsiniz, bunun yerine şeyleri “aksan-duyarsız” olarak eşleştirebilmeyi istersiniz, değil mi? Öyleyse, bunu ICU4J (Java için ICU) harmanlayıcı sınıfını kullanarak yapabilirsiniz . Birincil güçte karşılaştırırsanız, aksan işaretleri sayılmaz. Bunu her zaman yapıyorum çünkü İspanyolca metinleri sıklıkla işliyorum. İhtiyacın olursa buralarda bir yerde oturan İspanyolca için bunu nasıl yapacağına dair bir örneğim var.