我正在測驗Pattern.UNICODE_CHARACTER_CLASS不同標點符號的標志行為,并注意到重音字符(U 0060)的匹配`發生不同,具體取決于是否Pattern.UNICODE_CHARACTER_CLASS使用。
例如,請看下面的代碼:
public class GraceAccentTest {
public static void main(String args[]) {
Pattern p = Pattern.compile("\\p{Punct}");
Matcher m = p.matcher("`");
System.out.println(m.matches()); // returns true
Pattern p1 = Pattern.compile("\\p{Punct}", Pattern.UNICODE_CHARACTER_CLASS);
Matcher m1 = p1.matcher("`");
System.out.println(m1.matches()); // returns false
}
}
當我不使用Pattern.UNICODE_CHARACTER_CLASS標志重音字符與\p{Punct}字符類匹配但當我使用標志時它不匹配。有人可以解釋其中的原因嗎?
uj5u.com熱心網友回復:
當您使用Pattern p = Pattern.compile("\\p{Punct}");, then\p{Punct}指的是以下 32 個字符:
!"#$%&'()* ,-./:;<=>?@[\]^_`{|}~
參考:Pattern類。
這 32 個字符對應于 ASCII 字符集字符0x21,0x7e不包括字母和數字。它們也恰好代表了我的標準美式鍵盤上的所有非字母和非數字符號(當然,您的鍵盤可能不同)。
重音(也稱為反引號)在該串列和我的鍵盤上。
這是“預定義字符類”的一個簡單示例 - 并解釋了您m.matches()回傳的原因true。
當您添加Pattern.UNICODE_CHARACTER_CLASS標志時,事情變得更加復雜。
正如該標志的檔案所解釋的,它:
啟用預定義字符類和 POSIX 字符類的 Unicode 版本。
和:
當指定此標志時,(僅限 US-ASCII)預定義字符類和 POSIX 字符類符合 Unicode 技術標準 #18:Unicode 正則運算式附件 C:兼容性屬性。
查看上面提到的附件 C ,我們發現一個表格顯示了“兼容性屬性名稱的推薦分配”。
對于我們的屬性名稱 ( punct),標準建議是使用由此定義的字符:
\p{gc=Punctuation}
這里,“gc”代表“一般類別”。Unicode 字符被分配一個“一般類別”值。在這種情況下,即Punctuation- 也縮寫為P并進一步細分為各種子類別,例如Pc連接器、Pd破折號等。Po“其他標點符號”也有一個包羅萬象的內容。
墳墓字符被分配給SymbolUnicode 中的一般類別 - 以及Modifier子類別。您可以在Sk 此處查看該分配。
將其與諸如 ASCII 感嘆號之類的字符(也是我們原始\p{Punct}串列的一部分,如上所示)進行對比。為此,我們可以看到一般類別分配是Po。
Pattern.UNICODE_CHARACTER_CLASS這就解釋了為什么當我們將標志添加到原始模式時,墳墓不再匹配。
它被分配給與我們在正則運算式中使用的標點符號類別不同的??一般類別。
下一個明顯的問題是為什么墳墓字符沒有被包含在 UnicodePo通用類別中?為什么它在里面Sk?
我對此沒有一個好的答案——我確信有“歷史原因”。然而,值得注意的是,該Sk類別包括諸如重音、變音、分音符等字符 - 以及(如前所述)我們的重音。
所有這些都是變音符號 - 通常與基本字母結合使用以改變發音。所以也許這就是根本原因。
墳墓可能有點奇怪,因為它除了用作變音符號之外還有歷史用途。
首先,詢問墳墓如何成為原始 ASCII 字符集的一部分可能更相關。Wikipedia頁面中提供了一些關于此的背景資訊。
uj5u.com熱心網友回復:
閱讀檔案UNICODE_CHARACTER_CLASS
當指定此標志時,(僅限 US-ASCII)預定義字符類和 POSIX字符類符合 Unicode 技術標準 #18:Unicode 正則運算式附件 C:兼容性屬性。
所以這就是說只使用US-ASCII。因此,如果您檢查字符表標點符號,您將檢查有很多缺失的字符。
表:
https://www.fileformat.info/info/unicode/category/Po/list.htm
https://www.gaijin.at/en/infos/unicode-character-table-punctuation
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475182.html
下一篇:替換雙大括號正則運算式內的字符
