2011-05-11 49 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