2017-08-17 8 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を何それが分割する出力内に保持されないように、正規表現をとり、具体的には、regexで周りの文字列を分割します。あなたはそれが周りに分割したものをしたい場合は、例えば、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)); 
} 

これは、文字列内のパターンのすべての一致を検索し、それらを出力します。これらは、splitが文字列を分割するのに使用するのと同じ文字列です。

+0

同じ回答です。良いもの:D。 – Tavo

+0

'matcher.group()'と 'matcher.group(1)'の違いは何ですか?両方を試してみて、どちらも同じ出力を持っています。 – Morgan

+2

この場合は、一致するグループが1つしかないため同じです。ここで '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

関連する問題