当前位置: 首页 > 知识库问答 >
问题:

为什么 replaceAll 会因“非法组引用”而失败?

谭昊乾
2023-03-14

我需要替换

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

我用了

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

但它抛出异常

java.lang.IllegalArgumentException: Illegal group reference

共有3个答案

高墨一
2023-03-14

这里的问题不是正则表达式,而是替换:

$用于引用()匹配组。因此,您还需要使用反斜杠(和第二个反斜杠以使java编译器满意)对其进行转义:

String s="  $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
卫俊力
2023-03-14

在第二个参数中使用< code>"\\$\\$":

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

$ 是正则表达式替换参数中的组符号

所以你需要逃避它

姜胤
2023-03-14

From String#replaceAll javadoc:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与被视为文字替换字符串时的结果不同;请参见Matcher.replaceAll。如果需要,可以使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。

因此,可以使用Matcher#quoteRe福尼亚来转义任意替换字符串:

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

模式的转义也可以用模式#quote来完成

String s = "  $$";
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$"));
 类似资料:
  • 问题内容: 我需要更换 我用了 但它引发异常 java.lang.IllegalArgumentException:非法的组引用 问题答案: 使用第二个参数: 正则表达式的替换参数中的is组符号 所以你需要逃脱

  • 我在让Spark Cassandra连接器在Scala中工作时遇到问题。 我正在使用这些版本: 斯卡拉 2.10.4 火花芯 1.0.2 卡桑德拉-节俭 2.1.0 (我安装的卡桑德拉是 v2.1.0) cassandra-clientutil 2.1.0 卡桑德拉驱动器核心 2.0.4 (推荐用于连接器? 火花-卡桑德拉-连接器 1.0.0 我可以连接并与卡桑德拉(没有火花)交谈,我可以与火花(

  • 问题内容: 我有一个名为“ FechasFirmaHorometros”的视图,定义为 我有一个名为[RespuestaPreguntaHorometrosFecha]的函数定义为 在调试使用该函数的另一个存储过程时,我一直在碰到上述函数时收到此消息 但是我可以自由地做类似的事情 为什么会发生这种情况,我该如何解决或解决呢? 问题答案: 由于某种原因,我认为这是某种类型的字符串列。您应该解决该问题

  • 正如我在标题中所述,我只是不明白为什么这个函数会抛出<code>std::bad_alloc</code>。如果我们看一看cppreference,所有三种可能的实现都是如有人所假设的,并且看起来没有特别需要动态内存分配。

  • 为什么gcc在上的末尾插入了,而我却要自己在上添加? 从:

  • 问题内容: 在这段代码中,为什么使用结果为no 或循环捕获所有异常然后静默退出?在这种情况下,为什么会有多余的?还是由以下 原因引起的? 假设由触发。什么时候产生的? 如果我手动执行以下操作: 在这种情况下,为什么看不到追溯? 问题答案: 该循环监听明确。 该语句的目的是循环遍历迭代器提供的序列,并使用异常表示当前迭代器已完成。不会捕获被迭代的对象引发的其他异常,只是那个异常。 这是因为正常的预期