2011-07-21 27 views
3

正規表現:Java
問題:文字列がある場合、これらの文字列が引用符で囲まれている場合を除いて、文字列が引用符で囲まれている場合を除いて、文字列内の部分文字列を置き換えます。

例1:

string: "test substr 'test substr' substr" 
substring: "substr" 
replacement: "YYYY" 
output: "test YYYY 'test substr' YYYY" 

例2:

string: "test sstr 'test sstr' sstr" 
substring: "substr" 
replacement: "YYYY" 
output: "test sstr 'test sstr' sstr" 

例3:

string: "test 'test substr'" 
substring: "substr" 
replacement: "YYYY" 
output: "test 'test substr'" 

これは、これまで私の最高の試みである:

Regex: ((?:[^']*'[^']+')*?[^']*?)substring 
Replace: $1replacement 

引用符内の最後の文字列の後ろに引用符の外側に部分文字列が必要な場合は、それが機能しないので、Example3は失敗します(出力: "test 'test YYYY'")。

ご協力いただきありがとうございます。

答えて

4

は、ここでの方法です:

public class Main { 
    public static void main(String [] args) { 

     String[] tests = { 
       "test substr 'test substr' substr", 
       "test sstr 'test sstr' sstr", 
       "test 'test substr'" 
     }; 

     String regex = "substr(?=([^']*'[^']*')*[^']*$)"; 

     for(String t : tests) { 
      System.out.println(t.replaceAll(regex, "YYYY")); 
     } 
    } 
} 

プリント:'は、例えば\でエスケープすることができれば、これは動作しないことを

 
test YYYY 'test substr' YYYY 
test sstr 'test sstr' sstr 
test 'test substr' 

注意。

簡単に説明:

以下:([^']*'[^']*')*は0またはその間の非引用符で単一引用符の偶数と一致します、と[^']*$は、任意の非引用符と終了の文字列に一致します。

ので、substr(?=([^']*'[^']*')*[^']*$)完全な正規表現が0またはそれより前の単一引用符の偶数を持っている任意の"substr"一致し、は終わりの文字列にすべての方法を探していたときに!

ここで重要なのは、文字列の終わりまでです。あなたがそれをしないだろう場合は、以下の"substr"も交換することになります。

aaa 'substr' bbb 'ccc ddd' eee 
     ^ ^ ^
      |  |  | 
      i  ii  iii 

それは「見る」先行し、それの単一引用符の偶数ので(III)。あなたはそれの右にある文字列全体を見るように強制しなければなりません($まで)!

+0

多くの方に感謝Bart!どういうわけか私はコピーにこだわり、先を見越すことを考えなかった。 –

+0

@マリアス、どうぞよろしくお願いいたします。 –

関連する問題