2016-08-05 23 views
1

我想分割像這樣的字符串:"1.2 5"被標記化到{"1", ".", "2", "5"}(順序問題),我試圖做到這一點與String.split()使用下面的正則表達式:([0-9])\w*|\.,但是這是我想匹配,而不是分隔符。拆分使用正則表達式的字符串相匹配,而不是分隔符

有沒有可能做到這一點的另一種方法?甚至有可能分裂連接的兩個詞,同時保持兩個詞完整無缺? (例如,分 「1.2」 等上面的例子)

更多的例子:

"1 2 8" =>{"1", "2", "8"}

"1 122 .8" =>{"1", "122", "." "8"}

"1 2.800" =>{"1", "2", "." "800"}

+0

與'\ S'匹配。 –

+0

但是'1.2'之間可能沒有空格@WiktorStribiżew – shinzou

+0

請參閱http://ideone.com/As4Rpx。 '\ S'是一個非空白字符。 –

回答

1

此正則表達式應該工作(demo):

s.split("(?=\\.)(?<!)|(?<=\\.)| +") 

它通過在字符串中的地方劈裂:

  • 下一個字符是文字​​.(前瞻)和前面的字符是不是 a空間(負反向)
  • 前面的字符是字面意思.(lookbehind)
  • 存在一個或多個空格字符

的java的分裂函數移除字符串的任何匹配的部分。在前瞻/ lookbehind匹配的情況下,它們是零寬度,因此split在分割時實際上不會消耗任何字符串。零寬度匹配基本上只是在要分割的字符串中標記一個位置。

該解決方案適用於您給出的所有示例,也適用於多個空間。這是一個demo


迴應您對有關(?<!)部分正則表達式的評論。如果沒有該部分,該模式會匹配每個空格字符以及每個.之前和每個.之後的位置。你的一個例子有一個空格,然後由.(例如"2 .8"),這將拆分這樣的:

["2", "", ".", "8"] 

注意在第2位的空字符串。這是因爲它在空間上分裂了,然後在.之前找到了一個位置,並在那裏分裂。該(?<!)防止這種通過說「一.之前只有分裂,如果它不是一個空格字符開頭。

+0

你在哪裏學習RegEx或者如何學好RegEx? – shinzou

+0

我錯過了你的一個案例,查看我的編輯。 –

+0

接受我的答案,如果它是正確的! :) –

1

我寧願收集所有非數字和非空白符號與[^\d\s]和數字與\d

String s = "1.2 5"; 
Pattern pattern = Pattern.compile("\\d+|[^\\d\\s]+"); 
Matcher matcher = pattern.matcher(s); 
List<String> lst = new ArrayList<>(); 
while (matcher.find()){ 
    lst.add(matcher.group(0)); 
} 
System.out.println(lst); // => [1, 122, ., 8] 

參見Java demo

圖案的詳細資料

  • \d+ - 1或多個數字
  • | - 或
  • [^\d\s]+ - 的一個或多個字符不是空格其他或數字

這裏是一個regex demo

1

你不需要正則表達式匹配,Java有一個內置的StringTokenizer這僅僅是這一點。

試試這個:

StringTokenizer st = new StringTokenizer("1.2 5", ". "); 
while(st.hasMoreTokens()) { 
    System.out.println(st.nextToken()); 
} 

輸出:

1 
2 
5 

編輯:如果您想包括分隔符,使用新StringTo kenizer(字符串,分隔符,returnDelims = true)。在這種情況下,輸出爲:

1 
. 
2 

5 

如果您只是想返回點而不是空格,請在循環中跳過它。

+0

你應該仔細閱讀這個問題。 –

相關問題