2017-02-25 84 views
3

這是Java 7在Java中分割字符串?

我不知道正則表達式,所以我想知道是否有人知道我怎麼會用分裂的方式,讓所有的用戶名進行的字符串:

{tchristofferson=10, mchristofferson=50} 

,然後將用戶名添加到一個String []數組?這裏只有兩個用戶名,但我希望這可以用於無限量的用戶名。

用戶名所需要的格式如下:

3-16字符,沒有空格,A-Z上,下殼體和0-9中,只有特殊字符是下劃線(_)。

+0

用戶名中有效的字符是什麼?它可以包括數字和_-等特殊字符。 –

+0

你應該使用哪個版本的Java來完成這個任務? – j2ko

+0

我在java 7 – tchristofferson

回答

1

這看起來像JSON,因此,「正確」的答案很可能是使用JSON解析器。如果這不是一種選擇,你可以根據=標誌去掉封閉{},根據", "分割字符串,然後分割每個字符串,採取的第一項:

String input = "{tchristofferson=10, mchristofferson=50}"; 
List<String> users = 
    Arrays.stream(input.substring(1, input.length() - 1).split(", ")) 
      .map(s -> s.split("=")[0]) 
      .collect(Collectors.toList()); 
+1

這不是有效的JSON:JSON應該圍繞字符串值進行引號(並且,嚴格來說,鍵名也是)。大多數解析器會拒絕這個輸入。 – slim

+1

實際上JSON應該有冒號而不是等於 – Jack

+0

[Pattern#splitAsStream](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#splitAsStream-java.lang。 CharSequence-)可能更加簡潔。 – AJNeufeld

1

這是錯誤的(工作安全)的方式:

String[] usernames = str.substring(1) 
         .split("=\\d+[,}]\\s*"); 

爲什麼這是錯誤的方式?我們扔掉了我們不想要的東西。 第一個字符(不管它是什麼),並希望"=#, "和「=#}」是我們不希望的唯一的東西。 如果字符串開始"{ tchristofferson=10",那麼第一個用戶名會得到一個前導空格。

更好的方法是要匹配你想要的東西。而現在,我並不想給iPhone屏幕上創建了答案,那就是:

String input = "{tchristofferson=10, mchristofferson=50}"; 

    Pattern USERNAME_VALUE = Pattern.compile("(\\w+)=(\\d+)"); 
    Matcher matcher = USERNAME_VALUE.matcher(input); 

    ArrayList<String> list = new ArrayList<>(); 
    while(matcher.find()) { 
     list.add(matcher.group(1)); 
    } 
    String[] usernames = list.toArray(new String[0]); 

這裏假設你的用戶名中的每個字符的\w模式相匹配(即[a-zA-Z0-9_]和其他字母數字Unicode代碼點) 。如果您的用戶名要求更多/更少限制,請修改。

(\w+)用於捕獲用戶名爲matcher.group(1),該用戶名被添加到最終變成您的String[]的列表中。

(\d+)也被用於捕捉與該用戶作爲matcher.group(2)相關的數字。這個捕獲組沒有(目前)被使用,因此您可以刪除小括號以獲得較小的效率增益,即"(\\w+)=\\d+"。如果你想對這些值做些什麼的話,我會把它包括進來。

0

你可以嘗試分裂時沒有(^)一詞(A-ZA-Z):

String[] tokens = test.split("[^A-Za-z]"); 

如果不介意使用列表,嘗試像@Mureinik與建議:

List<String> tokens2 = Arrays.stream(test.split("[^A-Za-z]")) 
      .distinct() 
      .filter(w -> !w.isEmpty()) 
      .collect(Collectors.toList()); 

EDIT1

如果列表中包含數字嘗試:

String [] tokens = test.split(「[^ A-Za-z \ w]」);

,如果你想用正則表達式來試驗我強烈推薦這個網站:

http://regexr.com/

+0

如果用戶名可能包含數字,我怎麼能這樣做? – tchristofferson

+0

'[^ A-Za-z \\ w]'相當於'[^ \\ w]',相當於'\ W'。這給出了「[」「」,「tchristofferson」,「10」,「」,「mchristofferson」,「50」]'的輸出,其中'「」''''10「',''''和'」 50「'不是用戶名。 – AJNeufeld

+0

你說得對。我會解決這個問題。 –

0

如果用戶名包括和特殊字符,例如=則:

String str = "tchristofferson=10,mchristofferson=50";  
Pattern ptn = Pattern.compile(","); 
String[] usernames = ptn.split(str);