2015-12-17 482 views
-2

什麼正則表達式模式,我需要傳遞給String.split()方法將字符串拆分成一個子字符串數組使用空格以及以下字符作爲分隔符。 (" ! ", " , " , " ? " , " . " , " \ " , " _ " , " @ " , " ' ")它也可以是上述字符與空格的組合。我已經試過這樣的事情:如何在java中使用分隔符分割字符串?

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.*; 
class StringWordCount { 
    public static void main(String[] args) throws IOException { 

     BufferedReader bufferedReader = new BufferedReader(new IputStreamReader(System.in)); 
     String string = bufferedReader.readLine(); 
     String delimiter = "[,\\s]+|\\[!\\s]+|\\[?\\s]+|\\[.\\s]+|\\[_\\s]+|\\[_\\s]+|\\['\\s]+|\\[@\\s]+|\\!|\\,|\\?|\\.|\\_|\\'|\\@"; 
     String[] words = string.split(delimiter); 
     System.out.println(words.length); 
     for(int i = 0; i<words.length; i++) { 
     System.out.println(words[i]); 
     } 
} 

}

上面的代碼只生成了一些測試用例正確的輸出,在其他情況下,也不會產生正確的one.For例如, 考慮下面的字符串,它沒有得到預期的輸出。

了它的輸出:

23 
Hello 
thanks 
for 
attempting 
this 
problem 

Hope 
it 
will 
help 
you 
to 
learn 
java 

Good 
luck 
and 
have 
a 
nice 
day 

取而代之的是一個:

21 
Hello 
thanks 
for 
attempting 
this 
problem 
Hope 
it 
will 
help 
you 
to 
learn 
java 
Good 
luck 
and 
have 
a 
nice 
day 

正如你可以在第一個輸出中看到,其留下的" ! "[space]和組合空間上述組合的分隔符是\\[!\\s],對嗎?

+4

可能的重複[如何在Java中拆分字符串](http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java) – Tushar

+1

@Tushar和其他人:問題你稱之爲「重複」是由不知道split()的人發佈的。這位提問者知道'split'並且無法正確地獲取分隔符。這不是重複的。 – ajb

+0

在給定場景下,StringTokenizer更合適。儘管它已被掃描器和拆分方法所取代。 –

回答

2

在這一行:

String delimiter = "[,\\s]+|\\[!\\s]+|\\[?\\s]+|\\[.\\s]+|\\[_\\s]+|\\[_\\s]+|\\['\\s]+|\\[@\\s]+|\\!|\\,|\\?|\\.|\\_|\\'|\\@"; 

你有字符串常量,這意味着該模式有兩個字符\[在它\\[。在模式匹配器中,這會導致匹配器查找[字符。這不是你想要的。

\字符出現在模式字符串:

  1. 如果下面的字符是字母或數字,該組合具有一些特殊的意義(例如,你在字符串中使用\s意思空格),
  2. 如果下面的字符不是字母和數字的其他東西,這意味着對待後面的字符作爲本身。該角色可能具有的任何特殊含義被取消

它看起來像你正在嘗試使用[!\s]+(在模式;當然,你不得不把字符串字面的反斜槓雙)在一套!和空白匹配一個或多個字符。在這裏,[]具有特殊含義,以匹配集合中的任何字符。但在[取消[的特殊含義之前加上\,並使匹配器在輸入中查找[,它找不到它。

查看this javadoc瞭解更多信息。

我不確定,但我認爲擺脫所有\\之前,每個[將使事情工作。這種模式仍然會比所需要的更加複雜(並且我不能100%清楚要求是什麼,所以我很難提出改進建議)。

+0

感謝@ajb。請勿指定確切的要求。因爲我剛開始使用Java。在試圖解決這個問題之前,我應該先看看javadoc。在每個'['已經準確地爲所有可能的測試案例工作之前,去除那些'\'。再次感謝。 :) – Batman25663

0

只是做配套,而不是分裂..

ArrayList<String> lst = new ArrayList<String>(); 
Matcher m = Pattern.compile("\\w+").matcher(s); 
while(m.find()) { 
    lst.add(m.group()); 
    } 
4

你可以試試這個:

String str = "Hello, thanks for attempting this problem! Hope it will help you to learn java! Good luck and have a nice day!"; 
//String[] split = str.split("[\\p{Punct}\\s+]"); 
String[] split = str.split("[\\p{Punct}\\p{Blank}]+"); 
System.out.println("Arrays.toString(split) = " + Arrays.toString(split)); 

結果是:

Arrays.toString(split) = [Hello, thanks, for, attempting, this, problem, Hope, it, will, help, you, to, learn, java, Good, luck, and, have, a, nice, day] 

Eited:下面

編輯的行
String[] split = str.split("[\\p{Punct}\\p{Blank}]+"); 
相關問題