\p{InCombiningDiacriticalMarks}
è una proprietà di blocco Unicode. In JDK7, sarai in grado di scriverlo usando la notazione in due parti \p{Block=CombiningDiacriticalMarks}
, che potrebbe essere più chiara per il lettore. È documentato qui in UAX # 44: "The Unicode Character Database" .
Ciò che significa è che il punto di codice rientra in un intervallo particolare, un blocco, che è stato assegnato per essere utilizzato per le cose con quel nome. Questo è un cattivo approccio, perché non vi è alcuna garanzia che il punto di codice in quell'intervallo sia o non sia una cosa particolare, né che i punti di codice al di fuori di quel blocco non abbiano essenzialmente lo stesso carattere.
Ad esempio, ci sono lettere latine nel \p{Latin_1_Supplement}
blocco, come é, U + 00E9. Tuttavia, ci sono anche cose che non sono lettere latine. E naturalmente ci sono anche lettere latine dappertutto.
I blocchi non sono quasi mai quello che vuoi.
In questo caso, sospetto che potresti voler utilizzare la proprietà \p{Mn}
, alias \p{Nonspacing_Mark}
. Tutti i punti di codice nel blocco Combining_Diacriticals sono di questo tipo. Ci sono anche (a partire da Unicode 6.0.0) 1087 Nonspacing_Marks che non sono in quel blocco.
Questa è quasi la stessa di controllare per \p{Bidi_Class=Nonspacing_Mark}
, ma non del tutto, perché questo gruppo comprende anche i marchi di cinta, \p{Me}
. Se vuoi entrambi, potresti dire [\p{Mn}\p{Me}]
se stai utilizzando un motore regex Java predefinito, poiché dà accesso solo alla proprietà General_Category.
Dovresti usare JNI per accedere alla libreria regex C ++ ICU come fa Google per accedere a qualcosa di simile \p{BC=NSM}
, perché al momento solo ICU e Perl danno accesso a tutte le proprietà Unicode. La normale libreria di espressioni regolari Java supporta solo un paio di proprietà Unicode standard. In JDK7 però ci sarà il supporto per la proprietà Unicode Script, che è quasi infinitamente preferibile alla proprietà Block. Quindi in JDK7 puoi scrivere \p{Script=Latin}
o \p{SC=Latin}
, o la scorciatoia \p{Latin}
, per ottenere qualsiasi carattere dalla scrittura latina. Questo porta a ciò che è molto comunemente necessario [\p{Latin}\p{Common}\p{Inherited}]
.
Tieni presente che ciò non rimuoverà ciò che potresti considerare come segni di "accento" da tutti i caratteri! Ce ne sono molti per i quali non lo farà. Ad esempio, non è possibile convertire Đ in D o ø in o in questo modo. Per questo, è necessario ridurre i punti di codice a quelli che corrispondono alla stessa forza di confronto primaria nella tabella di confronto Unicode.
Un altro punto in cui la \p{Mn}
cosa fallisce è ovviamente racchiudere segni come \p{Me}
, ovviamente, ma ci sono anche \p{Diacritic}
caratteri che non sono segni. Purtroppo, è necessario il supporto completo delle proprietà per questo, il che significa JNI per ICU o Perl. Java ha molti problemi con il supporto Unicode, temo.
Oh aspetta, vedo che sei portoghese. Allora non dovresti avere problemi se hai a che fare solo con testo portoghese.
Tuttavia, scommetto che non vuoi davvero rimuovere gli accenti, ma piuttosto vuoi essere in grado di abbinare le cose in modo "insensibile agli accenti", giusto? In tal caso, è possibile farlo utilizzando la classe di raccolta ICU4J (ICU per Java) . Se confronti la forza primaria, gli accenti non contano. Lo faccio sempre perché elaboro spesso il testo spagnolo. Ho un esempio di come farlo per lo spagnolo seduto qui da qualche parte se ne hai bisogno.