Java 如何删除字符串中$后面的空格?

Java 如何删除字符串中$后面的空格?,java,regex,Java,Regex,我有一个输入,在$和值之间有一个空格,我想删除这个空格。此代码: System.out.println("This costs $ 5 even.".replaceAll("\\$ ", "$")); 应打印: 这个价格甚至是5美元。 但它抛出了一个例外: 非法组引用:缺少组索引 java.lang.IllegalArgumentException 位于java.util.regex.Matcher.appendReplacement(Matcher.java:819) 位于java.uti

我有一个输入,在$和值之间有一个空格,我想删除这个空格。此代码:

System.out.println("This costs $ 5 even.".replaceAll("\\$ ", "$"));
应打印:

这个价格甚至是5美元。
但它抛出了一个例外:

非法组引用:缺少组索引
java.lang.IllegalArgumentException
位于java.util.regex.Matcher.appendReplacement(Matcher.java:819)
位于java.util.regex.Matcher.replaceAll(Matcher.java:955)
位于java.lang.String.replaceAll(String.java:2223)
在DollarTest.test(DollarTest.java:18)
我缺少什么?

只需使用:


问题是在正则表达式替换字符串中,
$
是特殊的。它应该用来指代正则表达式本身的一个捕获组

你需要逃避它:

.replaceAll("\\$ ", "\\$")

但是,您最好在此处使用一个普通的
.replace()

另一种选择-将$和值按空格分组,然后在替换中合并它们

String s = "This costs $ 5 even. That costs $ 6 even. This is a $ sign.";
System.out.println(s.replaceAll("(\\$)\\s(\\d+)", "$1$2"));
输出

This costs $5 even. That costs $6 even. This is a $ sign.
它还指出了其他答案中的一个缺陷

String s = "This costs $ 5 even. That costs $ 6 even. This is a $ sign.";
System.out.println(s.replaceAll("\\$ ", "\\$"));
输出
“$sign”


我建议您使用下面的正则表达式来删除$和下一个数字之间的任何数量的空格

try {
    String data = "This costs $          7 even";
    String resultString = data.replaceAll("(?is)(?<=\\$)\\s*(?=\\d+)", "");
    System.out.println(resultString);

} catch (PatternSyntaxException ex) {

}
输出:


什么也不做c@james.garriss为…工作me@james.garriss对我来说也是如此。定义“什么都不做”。啊。我看到了区别。我正在使用
replaceAll()
,因为我要进行多个替换。很抱歉在问题中没有提及。@james.garriss我的解决方案应该适用于任何数量的替换。这是我的问题!我忘了退出输出。谢谢。顺便说一句,
.replace()
不是一个选项,因为我实际上有多个替换(我在问题中没有提到这一点)。@james.garriss但是.replace()会替换所有出现的情况!是的,我知道,名字让人困惑。不同之处在于.replace()的参数不是正则表达式,而是纯字符串文本。请参阅javadoc:)不要与.replaceFirst()混合使用!也许有人投了反对票,因为
$
与指的是一个抓捕小组,充其量只是传播不正确的信息无关。@james.garriss-如果你没有美元符号后面的数字,这是一个更好的答案。查看更新
This costs $5 even. That costs $6 even. This is a $sign.
try {
    String data = "This costs $          7 even";
    String resultString = data.replaceAll("(?is)(?<=\\$)\\s*(?=\\d+)", "");
    System.out.println(resultString);

} catch (PatternSyntaxException ex) {

}
This costs $ 5 even
This costs $6 even
This costs $          7 even
This costs $          77 even
This costs $          7.2 even
This costs $          0.21 even
It's cost is between $   5.2 and $   8.3
You don't have to pay top $ for this.
This costs $5 even
This costs $6 even
This costs $7 even
This costs $77 even
This costs $7.2 even
This costs $0.21 even
It's cost is between $5.2 and $8.3
You don't have to pay top $ for this.