79

私は交換する必要があります

\\\s+\\$\\$ to $$

使った

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$","$$");

しかし、それは例外をスローします

java.lang.IllegalArgumentException: 不正なグループ参照です

4

8 に答える 8

60

"\\$\\$"2 番目のパラメーターで使用します。

String s="  $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");

正規表現の置換パラメーターの$is グループ記号

だから逃げる必要がある

于 2012-08-11T10:09:51.650 に答える
6

ここでの問題は正規表現ではなく、次の置換です。

$ は、()一致するグループを参照するために使用されます。したがって、バックスラッシュ (および Java コンパイラを満足させるために 2 つ目のバックスラッシュ) を使用してエスケープする必要があります。

String s="  $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
于 2012-08-11T10:10:00.747 に答える
2

これが正しい方法です。リテラル $ をエスケープされた \\$ に置き換えます str.replaceAll("\\$", "\\\\\\$")

于 2017-12-14T17:47:09.733 に答える
2
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);
 }

}

于 2020-01-15T10:45:26.283 に答える
1

私は同じ問題を抱えていたので、すべてを分割して置換することになりました。
それは私のために例外を解決しました

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();
}
于 2017-01-12T18:51:46.537 に答える
0
String s="$$";
        s=s.replaceAll("\\s+\\$\\$","$$");
于 2012-08-11T10:12:12.547 に答える
0

$正規表現だけでなく、置換文字列でも特別な意味を持つため、そこでもエスケープする必要があります。

s=s.replaceAll("\\s+\\$\\$", "\\$\\$");
于 2012-08-11T10:10:21.060 に答える