私は交換する必要があります
\\\s+\\$\\$ to $$
使った
String s = " $$";
s = s.replaceAll("\\s+\\$\\$","$$");
しかし、それは例外をスローします
java.lang.IllegalArgumentException: 不正なグループ参照です
"\\$\\$"
2 番目のパラメーターで使用します。
String s=" $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");
正規表現の置換パラメーターの$
is グループ記号
だから逃げる必要がある
ここでの問題は正規表現ではなく、次の置換です。
$ は、()
一致するグループを参照するために使用されます。したがって、バックスラッシュ (および Java コンパイラを満足させるために 2 つ目のバックスラッシュ) を使用してエスケープする必要があります。
String s=" $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
これが正しい方法です。リテラル $ をエスケープされた \\$ に置き換えます
str.replaceAll("\\$", "\\\\\\$")
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class HelloWorld{
public static void main(String []args){
String msg = "I have %s in my string";
msg = msg.replaceFirst(Pattern.quote("%s"), Matcher.quoteReplacement("$"));
System.out.println(msg);
}
}
私は同じ問題を抱えていたので、すべてを分割して置換することになりました。
それは私のために例外を解決しました
public static String replaceAll(String source, String key, String value){
String[] split = source.split(Pattern.quote(key));
StringBuilder builder = new StringBuilder();
builder.append(split[0]);
for (int i = 1; i < split.length; i++) {
builder.append(value);
builder.append(split[i]);
}
while (source.endsWith(key)) {
builder.append(value);
source = source.substring(0, source.length() - key.length());
}
return builder.toString();
}
String s="$$";
s=s.replaceAll("\\s+\\$\\$","$$");
$
正規表現だけでなく、置換文字列でも特別な意味を持つため、そこでもエスケープする必要があります。
s=s.replaceAll("\\s+\\$\\$", "\\$\\$");