2013-02-18 71 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