讀古今文學網 > 精通正則表達式(第3版) > Java對\p{…}和\P{…}的支持 >

Java對\p{…}和\P{…}的支持

Java Support for\p{…}and\P{…}

「\p{…}」和「\P{…}」結構支持Unicode的屬性和區塊,也支持特殊的「Java」字符屬性。這種支持針對Unicode Version 4.0.0(Java 1.4.2只支持Unicode Version 3.0.0)。

Unicode屬性

Unicode屬性是通過\p{Lu}之類的縮寫名字來引用的(參加122頁的列表)。單字母屬性名可以省略括號,\pL等價於\p{L}。而\p{Lowercase_Letter}之類的長名稱是不支持的。Java 1.5及之前的版本是不支持Pi和Pf屬性的,因此,具有這種屬性的字符不能用\p{P}來匹配(Java 1.6支持)。

「未賦值的代碼點」屬性\p{Cn}匹配的字符,不能由「其他字符」屬性\p{C}來匹配。Java不支持組合屬性\p{L&}。

Java支持偽屬性\p{all},它等價於「(?S:.)」,但不支持\p{assigned}和\p{unassigned}偽屬性,不過我們可以用\P{Cn}和\p{Cn}來代替。

Unicode區塊

Unicode block的支持要求使用『In』前綴。請翻到第402頁查閱具體的版本信息,瞭解「\p{…}」和「\P{…}」中能夠出現的區塊名稱。

為了保持向後兼容性,Java 1.5中有兩個Unicode區塊在Unicode Version 3.0和4.0之間發生了變化。除了Unicode 4.0提供的Combining Diacritical Marks for Symbols和Greek and Coptic之外,還可以使用本不屬於Unicode 4.0的名稱Combining Marks for Symbols和Greek。

Java 1.4.2有個涉及Arabic Presentation Forms-B和Latin Extended-B的bug,在Java 1.5中已經修正。

特殊的Java字符屬性

從 Java 1.5.0 開始,\p{…}和\P{…}結構能夠支持 java.lang.Character 中未棄用(non-deprecated)的isSomething方法。為了在正則表達式中使用此功能,請把方法名開頭的『is』替換成『java』,然後使用「\p{…}」和「\P{…}」。例如,由java.lang.Characer.匹配的字符也能用正則表達式「\p{javaJavaIdentifierStart}」來匹配(請參考java.lang.Character類的文檔)。