2013-02-18 39 views
3

我需要创建一个将匹配所有Unicode数字和字母字符的Pattern。到目前为止,我有"\\p{IsAlphabetic}|[0-9]"Unicode数字的字符类

第一部分对我来说很好,它很好地将非拉丁字符识别为字母字符。问题在于下半场。显然它只适用于阿拉伯数字。字符类别\\d\p{Digit}也只是[0-9]。对于Pattern的javadoc似乎没有提到Unicode数字的字符类。有没有人有这个问题的良好解决方案?

为了我的目的,我会接受一种方法来匹配Character.isDigit返回true的所有字符集。

+0

'unicode digit'实际上是一个明确定义的概念吗? – us2012 2013-02-18 22:08:07

+0

在某种程度上,我会说是的。 Character类有一个isDigit方法,它对非拉丁数字返回true(我用日文数字测试过)。 – Aurand 2013-02-18 22:10:02

+0

如果使用Pattern.UNICODE_CHARACTER_CLASS会发生什么情况,如'Pattern p = Pattern.compile(“(?= \\ w +”,Pattern.UNICODE_CHARACTER_CLASS)'' – 2013-02-18 22:10:48

回答

4

引述Java docsisDigit

甲字符是数字,如果它的一般类别类型,通过的getType(码点)提供,是DECIMAL_DIGIT_NUMBER。

所以,我认为匹配数字的模式应该是\p{Nd}

这是位于ideone的working example。正如你所看到的,结果在Pattern.matchesCharacter.isDigit之间是一致的。

+0

看起来不错。谢谢! – Aurand 2013-02-18 22:41:50

+0

只要'\ p {N}'工作:'System.out.println(“333”.matches(“\\ p {N} +”))// true' – Bohemian 2016-04-25 18:33:00

+1

@Bohemian但是'p {N}'也是匹配'Nl'和'No',其'isDigit'不匹配。 [实施例](http://ideone.com/1GHJ1P)。有时你希望*匹配这些,但是由于OP要求的行为与'isDigit'一致,我只用'Nd'来回答。 – mgibsonbr 2016-04-26 00:12:45

4

使用\d,但与(?U)标志来启用预定义的字符类和POSIX字符类的Unicode版本:

(?U)\d+ 

或代码:

System.out.println("3๓३".matches("(?U)\\d+")); // true 

使用(?U)相当于编译正则表达式通过调用Pattern.compile()UNICODE_CHARACTER_CLASS标志:

Pattern pattern = Pattern.compile("\\d", Pattern.UNICODE_CHARACTER_CLASS); 
+0

其中一个我不认为重复的帖子值得赞成的罕见场合。新的答案和所有。你没有合并权力,还是不适用于这里? – Savior 2016-04-25 19:23:41

+1

@Pillar如此合并。恕我直言,这个答案更容易记忆和理解 - 谁能记住所有那些时髦的posix类? – Bohemian 2016-04-25 19:29:12

+0

你是指什么POSIX类?POSIX字符类是'[:punct:]','[:digit:]'等。'\ p {N}'或'\ p {L}'等是Unicode类别类别(.NET中使用的术语)或Unicode字符属性(在PHP中使用的术语),这些都非常方便,特别是'\ p {Ll}'和'\ p {Lu}'。在Java中,当然'(?U)\ d'看起来更可取。 – 2016-04-28 20:54:57