Java 与字符串÷;x%

Java 与字符串÷;x%,java,regex,exception,Java,Regex,Exception,我一直在尝试创建一个符合以下模式的正则表达式: ÷x% 这是我的密码: String string = "÷x%2%x#3$$@"; String myregex = "all the things I've tried"; string = string.replaceAll(myregex,"÷1x#1$%"); 我尝试了以下正则表达式:(÷x%),[÷][x][%],[÷]{1}[x]{1}[%]{1} 我正在使用NetBeans IDE,它给了我一个 非法组引用 但是,当我将strin

我一直在尝试创建一个符合以下模式的正则表达式:

÷x%

这是我的密码:

String string = "÷x%2%x#3$$@";
String myregex = "all the things I've tried";
string = string.replaceAll(myregex,"÷1x#1$%");
我尝试了以下正则表达式:(÷x%),[÷][x][%],[÷]{1}[x]{1}[%]{1}

我正在使用NetBeans IDE,它给了我一个

非法组引用

但是,当我将string的值更改为其他值时,例如一个单词

NetBeans没有给我一个例外


有什么想法吗,谢谢你替换所有出现的子字符串,你不需要模式。您可以使用:

根据javadoc方法:

用指定的文字替换序列替换与文字目标序列匹配的此字符串的每个子字符串


根据问题中的评论,我希望这能对
replaceAll
的工作原理有所帮助

根据JavaDoc,
replaceAll
将正则表达式作为第一个参数。在您的例子中,正则表达式看起来是合理的,因此没有问题

replaceAll
接受的第二个参数是用于替换正则表达式匹配的任何内容的字符串

在某些情况下,您需要将相同的模式替换为相同的(硬编码,如果愿意)字符串:

但是,在某些情况下,您希望在替换字符串本身中使用要替换内容的块。这就是
$
的作用:

String myString=“年龄:9;性别:男性”

假设您希望将字符串的格式更改为:“我是{性别}和{年龄}岁。”

在这种情况下,替换字符串需要从要替换的字符串中提取信息,并将其注入替换本身。您可以使用以下方法进行此操作:

String myString = "Age:9;Gender:Male";
myString = myString.replaceAll("Age:(\\d+);Gender:(\\w+)", "I am a $2 and I am $1 years of age.";
上面的内容应该会生成您要查找的字符串。请注意,我使用$1和$2访问正则表达式组。在正则表达式语言中,第0组是与整个正则表达式匹配的任何组。任何其他圆括号表示另一个正则表达式组,您可以通过
$
关键字访问该组


这就是它需要转义的原因。

在Java正则表达式中,必须转义$符号。 如果您写入$%,您将引用不存在的组%

您可以尝试:

try {
    String string = "÷x%2%x#3$$@";
    String myregex = "÷x%";
    String replace = "÷1x#1\\$%";
    String resultString = string.replaceAll(myregex, replace);
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
    // Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
    // Non-existent backreference used the replacement text
}

为什么需要正则表达式?当为
replaceAll
使用替换字符串中的
$
时,引擎需要一个组号。在您的例子中,``在
$
符号后面,因此引擎希望找到一个名为
%
的组,而在您的例子中,这个组不是您所拥有的。您需要将
$
转义为类似
\\$
,以便引擎将其视为文本。因为此模式在字符串中嵌入了1次或多次。我需要替换所有事件@zh使用
字符串。替换(“+x%”,“÷1x#1$%”
replace
replaceAll
都将替换所有出现的内容
replace
与正则表达式不匹配。@npinti为什么要转义$for replace。替换不只是一个字符串吗?我认为唯一重要的是正则表达式本身。这是一件很好的事情。它简化了事情。谢谢
String myString = "Age:9;Gender:Male";
myString = myString.replaceAll("Age:(\\d+);Gender:(\\w+)", "I am a $2 and I am $1 years of age.";
try {
    String string = "÷x%2%x#3$$@";
    String myregex = "÷x%";
    String replace = "÷1x#1\\$%";
    String resultString = string.replaceAll(myregex, replace);
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
    // Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
    // Non-existent backreference used the replacement text
}