当我使用包含java.lang.IndexOutOfBoundsException
的替换文字致电replaceAll()
时,我得到$1
:
这是一个更复杂的代码,但我简化如下:
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)
此问题是否有任何变通方法?我不想使用第三方库。
答案 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);