0

我试图在我的字符串中用“替换”。我在用

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

当我使用较新版本的 JAVA 时,它适用于我的开发机器。在测试机器上它会抛出 NoClassDefFounError 。与生产环境非常相似的测试机器具有旧版本的 JAVA。我不确定它是哪个版本。

我也试过,

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

它抛出 NoSuchMethod 异常。这也是同样的问题

myString.matches()

有人可以帮我解决在旧 JAVA 版本中使用正则表达式的方法吗?

提前致谢..

4

3 回答 3

3

从问题中的症状来看,您很可能在比 1.4 版本更早java.util.regex的 JVM 上运行,也就是引入包的时候。我认为您可以尝试推动他们升级系统,因为 1.4 版本于 11 年前的 2002 年首次发布

现在,您可以使用String.indexOfand 1。这不是很漂亮,但足以用于固定字符串搜索和替换2StringBuffer

如果你坚持使用正则表达式,JRegex 库值得一试。该网站声称它适用于任何版本的 Java,并且它支持的正则表达式功能非常丰富。

脚注

1 StringBuilder仅适用于 Java 1.5

2 String.replace(CharSequence target, CharSequence replacement),它用另一个固定字符串替换一个固定字符串,仅在 Java 1.5 中可用。

于 2013-04-25T11:41:19.450 回答
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);
    }
}
于 2013-04-30T11:02:05.757 回答
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) {
        }
    }
}
于 2013-09-23T06:10:22.643 回答