3

この例を試してみましたが、2つの行を交換するだけで、異なる出力が得られます。

String inputString = "username@gmail.com"; 
String pattern="([a-z]+@)([a-z]+)(\\.[a-z]+)";
Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(inputString); 

///ここで変更が発生します

if(m.find()) 
{
   String resultString = m.replaceAll("$1xxxx$3"); 
   System.out.println(resultString); 
}

System.out.println(m.matches());//line to be changed

出力:

username@xxxx.com

true

System.out.println(m.matches());//line changed     
if(m.find()) 
{
   String resultString = m.replaceAll("$1xxxx$3"); 
   System.out.println(resultString); 
}

出力:true

4

3 に答える 3

5

Matcher.findドキュメントから抽出

探す

public boolean find()

パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。このメソッドは、このマッチャーの領域の先頭から開始します。または、メソッドの前回の呼び出しが成功し、マッチャーがリセットされていない場合は、前回の一致と一致しなかった最初の文字から開始します。

一致が成功した場合は、start、end、およびgroupメソッドを介してより多くの情報を取得できます。

戻り値:入力シーケンスのサブシーケンスがこのマッチャーのパターンと一致する場合にのみtrue

つまり、Matcher.matchesString全体を一致させようとする呼び出しを行い、マッチャーをリセットしなかったため、最初の一致の後に開始を見つけようとしました。一致するものが1つしかないため、何も見つかりません。

于 2012-11-13T14:11:35.057 に答える
2

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#find()

マッチャーの以前の使用から中断された場所から検索が開始されます

まず、これはinputStringの開始を意味します。

ただし、matches()はinputString全体を考慮に入れるため、これによりポインターが最後に移動します。その結果、それ以上は検出されず、この場合のfind()はfalseです(後続として)

于 2012-11-13T14:14:25.463 に答える
2

メソッドreplaceAll(String replace)のjavadocには、「このメソッドを呼び出すと、このマッチャーの状態が変更されます。マッチャーを以降のマッチング操作で使用する場合は、最初にリセットする必要があります」と記載されています。

ですから、交換後はマッチャーが同じ状態ではなくなったため、この不一致を見つけていると思います。交換後、マッチャーをリセットしてみてください。

于 2012-11-13T14:47:34.587 に答える