2011-09-12 17 views
2

与えられた式を使用して、マッチャーが見つけることができる文字列を取得しようとしています。このようなもの..Java:入力から一致した文字列を取得

if(matcher.find()) 
    System.out.println("Matched string is: " + ?); 

これにはどのようなコードが適していますか? Oracleによれば

matcher.group(); 

方法は、予め

matcher.group(0); 

おかげと同じだけ設けられた入力を..返す

編集:

例を以下次の

private static String fileExtensionPattern = ".*<input type=\"hidden\" name=\".*\" value=\".*\" />.*"; 
private static Matcher fileXtensionMatcher; 
private static String input = text "<html><body><table width="96"><tr><td><img src=&quot;file:/test&quot; /><input type="hidden" name="docExt" value=".doc" />Employee Trv Log 2011 Training Trip.doc</td></tr></table></body></html>" 

private static void findFileExtension() { 
    System.out.println("** Searching for file extension **"); 
    System.out.println("Looking for pattern: " + fileExtensionPattern); 
    fileXtensionMatcher = fileXtensionExp.matcher(input); 

    if(fileXtensionMatcher.find()) { 
     //the extension expression is contained in the string 
     System.out.println("Extension expression found."); 
     System.out.println(fileXtensionMatcher.group()); 
    } 
} 

得られた結果は次のとおりです。

text "<html><body><table width="96"><tr><td><img src=&quot;file:/test&quot; /><input type="hidden" name="docExt" value=".doc" />Employee Trv Log 2011 Training Trip.doc</td></tr></table></body></html>" 
+1

をあなたはそれを試してみましたか?そうした場合、 'matcher.group()'が必要とするものを正確に実行できることが分かりました。 – Marcelo

+0

@Marcelo最後の答えにコメントをお読みください – arin

+0

あなたのソースコードを見てから答えが追加されました。 – Marcelo

答えて

3

あなたがソースコードを追加した後、それはあなたの正規表現にマッチするので、私は全体の入力文字列あなたgroup()リターンを確保することができます。

private static String fileExtensionPattern = "<input type=\"hidden\" name=\".*\" value=\".*\" />"; 

または使用:あなただけ<input>要素を使用したい場合は

private static String fileExtensionPattern = ".*(<input type=\"hidden\" name=\".*\" value=\".*\" />).*"; 
. . . 
System.out.println(fileXtensionMatcher.group(1)); 
+0

ありがとうございます。問題は"。* "の正規表現でした。あなたが言ったように、それは全体の文字列と一致していました、そして、group()は結果として文字列全体を返していました。 "。*"を最初と最後から削除すると結果が分かりました。 – arin

4

は、なぜあなたはそのgroup()リターン入力思いますか? the JavaDocによると

は、前回のマッチで一致した入力部分シーケンスを返します。

つまり、一致した入力のの部分がを返します。

+0

それは私が残した結果です。 – arin

+1

@NecArn: 'group()'が入力のマッシュされた部分を返すという事実を知っているので、例を挙げてください。 –

+0

ありがとう@ヨアヒム、メソッドの名前は私のために十分に明確ではありませんでした。結果のグループの知識がなければ、エラーが提供された正規表現ではなくメソッドにあると私は信じています。 – arin

2

アップデートを確認した後、マッチャーグループが必要なようです。また、あなたの試合を貪欲でないものにする必要があります(.*の代わりに.*?)。これを試してみてください:

private static String fileExtensionPattern = 
    ".*<input type=\"hidden\" name=\".*?\" value=\"(.*?)\" />([^<]*)"; 

// etc. 
private static void findFileExtension() { 

    // etc. 
    if(fileXtensionMatcher.find()) { 
     // etc. 
     System.out.println(fileXtensionMatcher.group(1)); 
     System.out.println(fileXtensionMatcher.group(2)); 
    } 
} 
+0

お返事ありがとうございました。この結果は、実際には、値フィールドとグループ(2)に(。*?)を使用して次の結果に拡張を抽出する労力を節約します。 – arin

+1

@Marceloは、主な問題は、正規表現の両端にある無関係な '。*'です。しかし、これは定量化器のリセットを非貪欲にすることについての非常に良い点です。属性値に '\" [^ \ "] * \" 'を使用することもできます。 –

関連する問題