2012-03-09 62 views
5

我試圖在問題歷史中找到問題的答案,但他們僅回來了一千多個,並且在掃描了幾十個匹配的答案之後,向上。 所以這是我的問題。Java REGEX與字符串中的精確位數匹配

我希望能夠找到字符串中正好六位數字的第一個序列。 鑑於字符串 「一些文字987654321和一些更多的文字123456和一些其他文字再次654321和更多文字最後」 我想找到匹配123456序列的正則表達式。

我是新來的正則表達式和關於它是如何工作的簡短說明將有很大幫助。

預先感謝您

+2

六位數字總是相同嗎?它會總是被空格分隔嗎?如果是這種情況,你可能根本不需要使用Regex。我只是好奇,因爲你沒有指定六位數字的性質。 – 2012-03-09 02:08:51

+0

我有興趣找到一個正好6位數的序列,不管它們是哪一個。 該序列可能被任何字符包圍,包括或不包含空格。當我說任何我的意思是可以有任何UTF-8字符。其實我的搜索字符串是繁體中文,我不知道這可能是什麼。重要的是,如果六位數字是多於六位數字的序列的一部分,不會產生任何匹配。 – Julian 2012-03-09 02:16:20

+0

這不是我想要的。 987654是超過6位數字序列(987654321)的一部分,我想排除這一點。 希望它澄清 謝謝 – Julian 2012-03-09 02:19:49

回答

11

您可以使用該模式(?<!\d)\d{6}(?!\d),意思是「不是由一個數字開頭的字符串位置;其次是究竟六位數字;其次是一個字符串位置後面沒有一位數字「。 (記號(?<!...),已知爲負向後斷言,指「不被...前面」。記號(?!...),已知爲負前向斷言,意思是「後面沒有...」。記號\d裝置的一個數字。記號{n}意味着 「ñ時代」,使得例如\d{6}意思是 「六位數」)

這可能是這樣的:

final String number; 
{ 
    final Matcher m = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)").matcher(input); 
    if(m.find()) 
     number = m.group(); // retrieve the matched substring 
    else 
     number = null; // no match found 
} 

備註:此答案的前一版本建議使用字邊界,\b;但是你的一個評論意味着這些數字可能會緊接着傳統中文字符的前面或後面,這些中文字符被認爲是單詞字符(因此不會觸發單詞邊界),所以我改變了這一點。

+0

'\ w','\ b',...是基於java的ASCII(所以你的'\ b'應該有意外工作),你可以通過使用Java 7標誌'UNICODE_CHARACTER_CLASS',請參閱[here](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS) – stema 2012-03-09 08:31:00

+0

@stema:在Java中,儘管' \ w'默認是基於ASCII的,'\ b'是基於Unicode的。 (不知道爲什麼。) – ruakh 2015-06-02 18:00:51

1

您發佈的字符串中首次出現6位數實際上是987654。如果你的意思的6位由不是數字字符的包圍中首次出現,那麼這應該工作:

(?<!\d)(\d{6})(?!\d) 

編輯: 此方法使用負回顧後和負前瞻。它比字邊界的做法略有不同,它會匹配以下字符串

123456asdf some text hello 

another string a123456 aaaaaaaa 

如果數字將始終用空格包圍123456那麼這個詞邊界的做法可能會更好。

+0

在我的示例中,我明確了我想要匹配的內容。也許這個問題不是很清楚。但你的正則表達式工作。非常感謝你。 – Julian 2012-03-09 02:35:43

6

你正在尋找的模式是:

(?x)    # enable comments 
(?<! \p{Nd})  # no decimal number before 
\p{Nd} {6}  # exactly six repetitions of a decimal number 
(?!= \p{Nd})  # no decimal number after 

這也將收拾東西像

U+FF10 ‭ 0 FULLWIDTH DIGIT ZERO 
U+FF11 ‭ 1 FULLWIDTH DIGIT ONE 
U+FF12 ‭ 2 FULLWIDTH DIGIT TWO 
U+FF13 ‭ 3 FULLWIDTH DIGIT THREE 
U+FF14 ‭ 4 FULLWIDTH DIGIT FOUR 
U+FF15 ‭ 5 FULLWIDTH DIGIT FIVE 
U+FF16 ‭ 6 FULLWIDTH DIGIT SIX 
U+FF17 ‭ 7 FULLWIDTH DIGIT SEVEN 
U+FF18 ‭ 8 FULLWIDTH DIGIT EIGHT 
U+FF19 ‭ 9 FULLWIDTH DIGIT NINE 

如果你有這些在中國的文字。

+2

非常好:+1支持全球化並且不受空白限制。 – 2012-03-09 02:24:40

1
public static String splitting(String str, int num){ 
    String arr[] = str.split("[^0-9]"); 
    for(String s:arr) 
     if(s.length() == num) 
      return s; 
    return null; 
} 

測試與

public static void main(String[] args) { 
    String s = "Some text 987654321 and some more text 123456 and some other text again 654321 and more text in the end"; 
    System.out.println(splitting(s, 6)); 
} 

輸出

123456 
0

在Javascript控制檯進行此操作。小心\\d

replacedString = "rx14ax145N".replace(RegExp("x14(?!\\d)", "g"), "___"); 

r___ax145N