2011-05-11 50 views
9

我碰到一些包含[^\\p{L}]的正則表達式。據我所知,這是使用某種形式的一個Unicode類的,但是當我檢查the documentation,我發現只有下面的「L」類:什麼是{L} Unicode類別?

Lu Uppercase letter UPPERCASE_LETTER 
Ll Lowercase letter LOWERCASE_LETTER 
Lt Titlecase letter TITLECASE_LETTER 
Lm Modifier letter  MODIFIER_LETTER 
Lo Other letter  OTHER_LETTER 

什麼是在這種情況下L

回答

12

從這個鏈接摘自:http://www.regular-expressions.info/unicode.html

檢查Unicode Character Properties部分。

\ p {L}匹配 類別中的單個代碼點「letter」。如果您的輸入 字符串被編碼爲U + 0061 U + 0300, ,則它與沒有重音的a匹配。如果 輸入被編碼爲U + 00E0,則其 與口音匹配à。原因 是代碼點U + 0061 (a)和U + 00E0(à)在類別 「字母」中,而U + 0300在 類別「標記」中。

+0

謝謝你+1。您對我評論/問題的評論以@Ned Batchelder的回答表示讚賞。 – uTubeFan 2011-05-11 19:35:05

+0

單純的鏈接值得接受。 – uTubeFan 2011-05-11 19:42:11

+0

有關「L」類別的「官方」引用,請參見:http://unicode.org/reports/tr18/#General_Category_Property – CodeClimber 2016-06-15 12:32:53

2

我沒有看到任何明確提及,但this page的例子表明,\\p{L}意味着任何字母:

Categories may be specified with the optional prefix Is: Both \p{L} and \p{IsL} denote the category of Unicode letters. 
+0

這就是我的想法,但爲什麼下面的正則表達式替換(用空格)**所有**這是**不是**字母? 'String.replaceAll(「[^ \\ p {L}]」,「」)' – uTubeFan 2011-05-11 19:32:55

+2

@uTubeFan:看到你在'^ \\ p {L}'中使用* negation *。所以當我做這樣的事時''Test akd ^^%!〜+ _)「。replaceAll(」[^ \\ p {L}]「,」「)',那麼它會輸出'Test akd'。相反,如果你這樣做''測試akd ^^%!〜+ _)「。replaceAll(」[\\ p {L}]「,」「);'那麼輸出將是'^^% !〜+ _)' – Favonius 2011-05-11 19:42:33

+0

@Favonius謝謝!那麼,我可以從中得出結論:'^%!〜+ _'是**不是**字母嗎? (我基本上是想用一個空格替換所有非字母(除了'''不是''的撇號'),任何建議嗎?) – uTubeFan 2011-05-11 19:47:46