String.replaceAll()抛出IndexOutOfBoundsException

时间:2011-12-13 12:11:55

标签: java

当我使用包含java.lang.IndexOutOfBoundsException的替换文字致电replaceAll()时,我得到$1

这是一个更复杂的代码,但我简化如下:

http://ideone.com/QCof3

class Test {
    public static void main(String args[]) {
        String test = "@Key";
        String replacement = "$1";
        test = test.replaceAll("@Key", replacement);
        System.out.println(test);
    }
}


Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 1
    at java.util.regex.Matcher.group(Matcher.java:470)
    at java.util.regex.Matcher.appendReplacement(Matcher.java:737)
    at java.util.regex.Matcher.replaceAll(Matcher.java:813)
    at java.lang.String.replaceAll(String.java:2189)
    at Test.main(Main.java:5)

此问题是否有任何变通方法?我不想使用第三方库。

6 个答案:

答案 0 :(得分:20)

尝试使用replace()

test = test.replace("@Key", replacement);

答案 1 :(得分:7)

String replacement = "\\$1";

应解决它。 $是一个正则表达式控制字符,所以就像任何其他控制字符一样,它必须被转义。 Java是java,转义必须是双反斜杠。

答案 2 :(得分:3)

如果你真的需要String.replaceAll()中的正则表达式而不仅仅是String.replace(),它确实替换了所有字符串但只是不使用正则表达式,你可以使用Matcher.quoteReplacement()

String stringwithgroup = "Give me all your $$$$";
String result = proposal.replaceAll("Marry me",Matcher.quoteReplacement(stringwithgroup));

答案 3 :(得分:2)

    String test = "@Key";
    String replacement = "\\$1";
    test = test.replaceAll("@Key", replacement);
    System.out.println(test);

答案 4 :(得分:2)

检查您的正则表达式。您想要捕获在正则表达式中选择的第一个组。但是你的正则表达式只有1美元。这意味着它需要第一组。但是没有这样的群体,所以有例外。

 Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 1

尝试将此命令与此正则表达式一起使用。

Class Test {  
   public static void main(String args[]) {  
      String test = "@Key";  
      String replacement = "!!$1";  
      test = test.replaceAll("(@Key)", replacement);  
      System.out.println(test);  
   }  
}

结果是test = !!@Key。因为第一组是@Key并且被!! @ Key替换。

请检查那些粗俗表达的链接。 Lesson REGEX
并且:Search and replace with regular expressions

希望这个帮助

答案 5 :(得分:1)

<强>解决方案

这是你需要做的:

String test = "@Key";
String replacement = "\\$1";
test = test.replaceAll("@Key", replacement);
System.out.println(test);

使用$#

&#39; $#&#39;,&#39;#&#39;作为replaceAll的第二个参数中的数字意味着它将获得第一组匹配。所以要正确使用它,这是一个例子:

String test = "World Hello!!!";
String replacement = "$2 $1";
test = test.replaceAll("(World) (Hello)", replacement);
System.out.println(test);

您可以使用括号创建组,代码将使用两个组并交换它们。

使用$

&#39; $&#39;在正则表达式中表示行的结尾。所以通过使用&#39; $&#39;作为replaceAll中的第一个参数,将追加到字符串的末尾,即:

String test = "World Hello!!!";     
test = test.replaceAll("$", " ~ a java dev");
System.out.println(test);