2016-08-24 2 views
-1

入力文字列を働いていない:07-000Javaの正規表現 "\ D +"(数字のみ)

JAVA正規表現:\\d+(数字のみ)

予想される結果:07000(のみ入力文字列から数字)

なぜこのJavaコードは07だけを返しますか?

Pattern pattern = Pattern.compile("\\d+"); 
Matcher matcher = pattern.matcher("07-000"); 

String result = null; 
if (matcher.find()) { 
    result = matcher.group(); 
} 
System.out.println(result);  
+0

なぜmatcher.findは数字の「1」「セット」にマッチするのですか?ドキュメントのどこにありますか?そして、 "セット"とは何ですか? –

+1

ドキュメントはhttps://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find()にあります。 'find'はパターンにマッチする最後の文字で停止します。 – Riaz

+0

Riazさんとsvasaさん、ありがとうございました。 –

答えて

1

なぜこのJavaコードは07のみを返しますか?

それはあなたの正規表現で見つかった最初のグループであるので、それが唯一の07を返し、あなたはすべてのグループを取得するために、後であなたが1つの文字列内のすべての数値を得るためにそれらを連結することができますwhileループを必要としています。

Pattern pattern = Pattern.compile("\\d+"); 
Matcher matcher = pattern.matcher("07-000"); 
StringBuilder sb = new StringBuilder(); 
while (matcher.find()) 
{ 
    sb.append(matcher.group()); 
} 

System.out.println("All the numbers are : " + sb.toString()); 
2

私は何を達成したいことは、むしろこれであることを推測する:

Pattern pattern = Pattern.compile("\\d+"); 
Matcher matcher = pattern.matcher("07-000"); 

StringBuilder result = new StringBuilder(); 
// Iterate over all the matches 
while (matcher.find()) { 
    // Append the new match to the current result 
    result.append(matcher.group()); 
} 
System.out.println(result); 

出力:

07000 

実際matcher.find()はと一致する入力内の次の部分シーケンスを返します。あなたがそれを一度だけ呼び出すならば、パターンは07ここにある最初の部分列だけを得るでしょう。したがって、利用可能な一致がもうないことを示すfalseを返すまでループする必要があるすべてを取得したい場合。

しかし、この特定のケースでは、直接myString.replaceAll("\\D+", "")と呼ぶ方がいいでしょう。これは、空のStringの任意の非数字文字で置き換えられます。