2012-05-06 11 views
0

これは単純な問題に見えますが、私はここに助けをapprisiateます:***XMLに正規表現を使用して、貪欲なマッチを避ける

は私が(任意の値にすることができる)に「*パスワード値を交換する必要があります

origunal刺さは、XML

からresived文字列で、問題は、私は出力としてのみの行を取得していることである:

  <parameter><value>*****</value></parameter> 

しかし、私は唯一のパスワード値を出力として文字列全体を必要とする

は、私が間違っていない場合、あなたは*さんと文字列のパスワードを変更したい事前に

 String originalString = "<parameter>" + 
      "<name>password</name>"+ 
      "<value>my123pass</value>"+ 
      "</parameter>"+ 
      "<parameter>"+ 
      "<name>LoginAttempt</name>"+ 
      "<value>1</value>"+ 
      "</parameter>"; 
    System.out.println("originalString: "+originalString);       
    Pattern pat = Pattern.compile("<name>password</name><value>.*</value>"); 
    Matcher mat = pat.matcher(originalString); 

    System.out.println("NewString: "); 
    System.out.print(mat.replaceFirst("<value>***</value>")); 
    mat.reset(); 
+1

は、あなたは涙を流す。つまり、あなたの問題は '。*'は欲張りなので、文字列中の最後の '' 'まで全てが一致しているということです。これは、正規表現を使用しようとする理由の1つが一般的に悪い考えです。 –

+2

星の後に疑問符を追加してください: '。*?'そしてそれがあなたにとって満足できるかどうかを見てください。それは貪欲を嫌悪な行動に変えます。 –

+0

あなたのタイトルは、改行について言及しているので誤解を招きました。問題に改行はありません。それを編集しました。 –

答えて

0

ありがとう置き換え。 Stringメソッドを直接使用することでそれを行うことができます。開始値タグの最後のインデックスを取得し、 "<"に達するまで繰り返し、その2つの値を*に置き換えます。このような何か:

int from = originalString.lastIndexOf("<name>password</name><value>"); 
bool endIteration = false; 
for(i = from + 1 ; i < originalString.length() && !endIteration ; i ++) { 
    if(originalString.toCharArray()[i] == '<') 
     endIteration = true; 
    else { 
     originalString.toCharArray()[i] = '*'; 
    } 
} 

EDIT:すべてのStringクラスのグッズを適切に使用することの別の方法があります:XMLは、一般的にのみリードして起こっているとマックするために正規表現を使用しようと

int from = originalString.lastIndexOf("<name>password</name><value>"); 
int to = originalString.indexOf("</value>", from); 
Arrays.fill(originalString.toCharArray(), from, to, '*'); 
関連する問題