這是Java 7在Java中分割字符串?
我不知道正則表達式,所以我想知道是否有人知道我怎麼會用分裂的方式,讓所有的用戶名進行的字符串:
{tchristofferson=10, mchristofferson=50}
,然後將用戶名添加到一個String []數組?這裏只有兩個用戶名,但我希望這可以用於無限量的用戶名。
用戶名所需要的格式如下:
3-16字符,沒有空格,A-Z上,下殼體和0-9中,只有特殊字符是下劃線(_)。
這是Java 7在Java中分割字符串?
我不知道正則表達式,所以我想知道是否有人知道我怎麼會用分裂的方式,讓所有的用戶名進行的字符串:
{tchristofferson=10, mchristofferson=50}
,然後將用戶名添加到一個String []數組?這裏只有兩個用戶名,但我希望這可以用於無限量的用戶名。
用戶名所需要的格式如下:
3-16字符,沒有空格,A-Z上,下殼體和0-9中,只有特殊字符是下劃線(_)。
這看起來像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());
這是錯誤的(工作安全)的方式:
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+"
。如果你想對這些值做些什麼的話,我會把它包括進來。
你可以嘗試分裂時沒有(^)一詞(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]」);
,如果你想用正則表達式來試驗我強烈推薦這個網站:
如果用戶名可能包含數字,我怎麼能這樣做? – tchristofferson
'[^ A-Za-z \\ w]'相當於'[^ \\ w]',相當於'\ W'。這給出了「[」「」,「tchristofferson」,「10」,「」,「mchristofferson」,「50」]'的輸出,其中'「」''''10「',''''和'」 50「'不是用戶名。 – AJNeufeld
你說得對。我會解決這個問題。 –
如果用戶名包括號和特殊字符,例如=則:
String str = "tchristofferson=10,mchristofferson=50";
Pattern ptn = Pattern.compile(",");
String[] usernames = ptn.split(str);
用戶名中有效的字符是什麼?它可以包括數字和_-等特殊字符。 –
你應該使用哪個版本的Java來完成這個任務? – j2ko
我在java 7 – tchristofferson