2013-04-25 46 views
0

我想在我的字符串中替換「with \」。我正在使用regExp匹配使用較舊的JAVA API

java.util.regex.Pattern.compile("\\\"").matcher(myString).replaceAll("\\\\\"") 

它適用於我的開發機器,因爲我使用較新版本的JAVA。在測試機器上,它會拋出NoClassDefFounError。與生產環境非常相似的測試機器具有舊版本的JAVA。我不確定它是哪個版本。

我也試圖與,

myString.replaceAll("\\\"","\\\\\""); 

它拋出NoSuchMethod異常。 此外,它是

myString.matches() 

同樣的問題,有人可以幫助我在老年JAVA版本的正則表達式的工作方式?

在此先感謝..

+2

這可能是環境比Java 1.4,當[java.util.regex中]年長(http://docs.oracle.com/javase/6/docs/api/java/util/regex /package-summary.html)首次引入。 – nhahtdh 2013-04-25 11:02:32

+0

是的。它肯定比那個更早 – 2013-04-25 11:03:50

+0

當然,你也應該使用高效的JVM來進行開發,因爲你會遇到很多次這些東西。 1.4中添加了許多API ... – 2013-04-25 11:05:28

回答

3

從問題的症狀,很可能是你在一個JVM是比1.4版本,在引入java.util.regex包,它是舊的運行。我認爲你可以嘗試推動他們升級系統,因爲版本1.4是first released 11 years ago in 2002

現在,您可以使用String.indexOfStringBuffer 。這不是很漂亮,但足以固定字符串搜索和替換。

如果你堅持使用正則表達式,JRegex library值得一試。該網站聲稱它可以在任何版本的Java上運行,並且它支持的正則表達式功能非常豐富。

腳註

StringBuilder僅提供從Java 1.5

String.replace(CharSequence target, CharSequence replacement),其與另一個固定字符串替換一個固定的字符串,僅可從Java 1.5。

0

在這裏,回答我自己的問題。

遵循簡單的代碼實現有效地轉義雙引號(即用「\」替換),並且也忽略已經轉義的引號。

int index = myString.indexOf('"'); 

while(index != -1){  
    if(index == 0 || myString.charAt(index-1) != '\\'){ 
     myString= myString.substring(0,index)+"\\\""+myString.substring(index+1); //Escaping the double quote if any in the string 
     index = myString.indexOf('"', index+2); 
    } 
    else{ 
     index = myString.indexOf('"', index+1); 
    } 
} 
0

那麼,Java 1.3沒有String.replaceAll?我們可以寫我們自己的嗎?

public class StringReplaceAll { 

    public static String replaceAll(String text, String find, String replace) { 
     if (text == null || find == null || replace == null) { 
      throw new NullPointerException(); 
     } 
     if (find.length() == 0) { 
      throw new IllegalArgumentException(); 
     } 
     int start = 0; 
     int end = text.indexOf(find, start); 
     if (end == -1) { 
      return text; 
     } 
     int findLen = find.length(); 
     StringBuffer sb = new StringBuffer(text.length()); 
     while (end != -1) { 
      sb.append(text.substring(start, end)); 
      sb.append(replace); 
      start = end + findLen; 
      end = text.indexOf(find, start); 
     } 
     sb.append(text.substring(start)); 
     return sb.toString(); 
    } 

    public static void assertEquals(String s1, String s2) { 
     if (s1 == null || s2 == null) 
      throw new RuntimeException(); 
     if (!s1.equals(s2)) 
      throw new RuntimeException("<" + s1 + ">!=<" + s2 + ">"); 
    } 

    public static void main(String[] args) { 
     assertEquals("lazy fox jumps lazy dog", 
       replaceAll("quick fox jumps quick dog", 
         "quick", 
         "lazy")); 

     assertEquals("quick fax jumps quick dag", 
       replaceAll("quick fox jumps quick dog", "o", "a")); 

     assertEquals("", 
       replaceAll("quick fox jumps quick dog", 
         "quick fox jumps quick dog", 
         "")); 

     assertEquals("quick fox jumps quick dog", 
       replaceAll("quick fox jumps quick dog", "zzz", "xxx")); 

     assertEquals("quick fox jumps quick cat", 
       replaceAll("quick fox jumps quick dog", "dog", "cat")); 

     assertEquals("zzzzzzzzzzzzzzzzzzzzzzzzz", 
       replaceAll("aaaaaaaaaaaaaaaaaaaaaaaaa", "a", "z")); 

     assertEquals("zzzz", replaceAll("aa", "a", "zz")); 

     assertEquals("", replaceAll("", "a", "z")); 

     try { 
      replaceAll(null, "a", "z"); 
      throw new RuntimeException(); 
     } catch (NullPointerException e) { 
     } 

     try { 
      replaceAll("a", "z", null); 
      throw new RuntimeException(); 
     } catch (NullPointerException e) { 
     } 

     try { 
      replaceAll("a", null, "z"); 
      throw new RuntimeException(); 
     } catch (NullPointerException e) { 
     } 

     try { 
      replaceAll("a", "", "z"); 
      throw new RuntimeException(); 
     } catch (IllegalArgumentException e) { 
     } 
    } 
}