\p{InCombiningDiacriticalMarks}
是一個Unicode塊屬性。在JDK7中,您可以使用兩部分表示法\p{Block=CombiningDiacriticalMarks}
來編寫它,這對讀者而言可能更加清晰。它記錄在here in UAX#44: 「The Unicode Character Database」。
這是什麼意思是代碼點落在一個特定的範圍,一個塊,已被分配用於該名稱的事情。這是一種不好的方法,因爲不能保證該範圍內的代碼點是或不是特定的東西,也不能保證該塊外的代碼點本質上不是相同的字符。
例如,在\p{Latin_1_Supplement}
塊中有拉丁字母,如é,U + 00E9。但是,有些東西是而非拉丁字母。當然,還有拉丁字母到處都是。
塊幾乎不是你想要的。
在這種情況下,我懷疑你可能想要使用屬性\p{Mn}
,也叫做\p{Nonspacing_Mark}
。 Combining_Diacriticals塊中的所有代碼點都屬於這種類型。還有(來自Unicode 6.0.0)1087 Nonspacing_Marks,該塊中的而不是。
這與檢查\p{Bidi_Class=Nonspacing_Mark}
幾乎相同,但不完全相同,因爲該組還包含封閉標記\p{Me}
。如果你想要兩者,如果你使用默認的Java正則表達式引擎,你可以說[\p{Mn}\p{Me}]
,因爲它只允許訪問General_Category屬性。
你不得不使用JNI來獲得在ICU C++ regex庫谷歌確實要訪問像\p{BC=NSM}
的方式,因爲現在只有ICU和Perl給所有 Unicode屬性的訪問。普通的Java正則表達式庫僅支持一些標準的Unicode屬性。在JDK7中雖然有將支持Unicode Script propery,這對Block屬性來說是無限可取的。因此,您可以在JDK7中編寫\p{Script=Latin}
或\p{SC=Latin}
或快捷方式\p{Latin}
以獲取拉丁腳本中的任何字符。這導致非常通常需要[\p{Latin}\p{Common}\p{Inherited}]
。
請注意,這將不會刪除您可能認爲所有角色的「重音」標記!有很多它不會這樣做。例如,您不能將Đ設置爲D或ø至或那樣。爲此,您需要將代碼點減少爲符合Unicode歸類表中相同主歸類強度的那些代碼點。
\p{Mn}
東西失敗的另一個地方當然包含了像\p{Me}
這樣的標記,很明顯,還有\p{Diacritic}
這些不是標記的字符。可悲的是,你需要完全的財產支持,這意味着JNI要麼是ICU要麼是Perl。恐怕,Java在Unicode支持方面有很多問題。
哦等等,我看你是葡萄牙人。如果你只是在處理葡萄牙語的文字,你應該沒有任何問題。
但是,我並不想刪除重音符號,我敢打賭,而是希望能夠匹配「不區分重音」的東西,對吧?如果是這樣,那麼你可以使用ICU4J (ICU for Java) collator class這樣做。如果您比較主要優勢,重音符號將不會被計算。我一直這樣做,因爲我經常處理西班牙文本。我有一個例子,說明如果你需要的話,西班牙人就坐在這裏。
另請參見http://stackoverflow.com/a/29111105/32453顯然,unicode中有更多「組合標記」,而不僅僅是變音符號,就像一個音符一樣。 – rogerdpack 2015-03-18 21:42:42