2016-07-29 9 views
1

Javaでは、正規表現を使用して、 "MM/DD/YYYY"の形式で日付文字列を解析します。私は括弧でキャプチャグループを作ってみましたが、うまくいかないようです。これは、 "MM"、 "DD"、 "YYYY"コンポーネントではなく、一致する文字列全体を返します。それは関係なく、私はそれを与えるどのような指標の例外を返さないよう引数を取るJava正規表現はキャプチャグループを返しません

public static void main(String[] args) { 
    Pattern p1=Pattern.compile("(\\d{2})/(\\d{2})/(\\d{4})"); 
    Matcher m1=p1.matcher("04/30/1999"); 

    // Throws IllegalStateException: "No match found": 
    //System.out.println("Group 0: "+m1.group(0)); 

    // Runs only once and prints "Found: 04/30/1999". 
    while (m1.find()){ 
     System.out.println("Found: "+m1.group()); 
    } 
    // Wanted 3 lines: "Found: 04", "Found: 30", "Found: 1999" 
} 

group」機能(m1.group(x))は、すべてで動作するようには思えません。 find()のルーピングは、単一の完全一致 "04/30/1999"のみを返します。正規表現のかっこはまったく役に立たないようです!

これはPerlで行うのは非常に簡単でした:

my $date = "04/30/1999"; 
my ($month,$day,$year) = $date =~ m/(\d{2})\/(\d{2})\/(\d{4})/; 
print "Month: ",$month,", day: ",$day,", year: ",$year; 
# Prints: 
#  Month: 04, day: 30, year: 1999 

私は何をしないのですか? Javaの正規表現はPerlのようなキャプチャグループを解析できませんか?

答えて

3

コールm1.find()はまず、その後、m1.group(N)

matcher.group()使用するか、全体マッチしたテキストを返すmatcher.group(0)
matcher.group(1)は、最初のグループと一致するテキストを返します。
matcher.group(2)は、2番目のグループと一致するテキストを返します。
...

コード

Pattern p1=Pattern.compile("(\\d{2})/(\\d{2})/(\\d{4})"); 
Matcher m1=p1.matcher("04/30/1999"); 

if (m1.find()){ //you can use a while loop to get all match results 
    System.out.println("Month: "+m1.group(1)+" Day: "+m1.group(2)+" Year: "+m1.group(3)); 
} 

結果

Month: 04 Day: 30 Year: 1999 

ideone demo

関連する問題