2017-08-17 138 views
3

我試圖想出一個正則表達式模式,但無濟於事。這裏有一些我需要的例子。 []表示一個數組作爲輸出。

輸入

Hello $World 

輸出

[$World] 

輸入

My name is $John Smith and I like $pancakes 

輸出

[$John, $pancakes] 

我設法提出這個,它符合模式,但不保留它找到的單詞。

String test = "My name $is John $Smith"; 
String[] testSplit = test.split("(\\$\\S+)"); 
System.out.println(testSplit); 

輸出

[My name , John ] 

正如你所看到的,它是完全吞噬我需要的話,更具體地說,字匹配模式的。我怎樣才能讓它返回一個只包含我需要的單詞的數組? (如示例所示)

+1

你可能想看看'split()'的作用:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html。也許你想要。嘗試將其改爲「match()」。 – Tavo

+0

我知道'split()'和'match()'的存在。 'split()'專門使用正則表達式來工作,其中存在這個問題。這個問題不是關於方法,而是關於使它正常工作所需的正則表達式。 – Morgan

+0

你的正則表達式正在工作。你只是用它錯誤的方式:) – Tavo

回答

6

split需要一個正則表達式,具體拆分字符串周圍該正則表達式,使其分裂什麼輸出不保留。如果你想它找到了什麼分裂周圍,你應該使用Matcher類,例如:

String line = "My name $is John $Smith"; 
Pattern pattern = Pattern.compile("(\\$\\S+)"); 
Matcher matcher = pattern.matcher(line); 

while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

這將找到一個模式的所有比賽中的String並打印出來。這些字符串與split將用於分隔字符串的字符串相同。

+0

同一答案。好的:D。 – Tavo

+0

'matcher.group()'和'matcher.group(1)'有什麼區別?嘗試兩者都有相同的輸出。 – Morgan

+2

在這種情況下,它是一樣的,因爲您只有一個匹配組。在這裏查看'group(int)'的規格:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int) – Tavo

3

split只是使用你的模式來分隔字符串。如果你想返回匹配的字符串,嘗試這樣的事情:

String test = "My name $is John $Smith"; 
Pattern patt = Pattern.compile("(\\$\\S+)"); 
Matcher matcher = patt.matcher(test); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
+2

' while(matcher.find())' – shmosel

+0

@shmosel你是絕對正確 – Tavo

+0

我不相信正則表達式中的括號是必要的。 – shmosel

相關問題