【问题标题】:replacing string with regex in java在java中用正则表达式替换字符串
【发布时间】:2017-01-09 18:59:47
【问题描述】:

我认为我在 Java 中使用 Regex 匹配字符串有一个不错的句柄,但现在我尝试使用 Regex 替换字符串并且没有取得多大成功。

简单地说,我试图找到一个数字紧跟一个常量字符串“CMR”的位置,然后在数字和“CMR”子字符串之间添加一个空格。 “0CMR”应该变成"0 CMR", "5CMR"应该变成“5 CMR”等等。任何前面的非数字都应该保持原样。

所以我的源字符串是“theStringThat0CMRhas

我的命令是:

replaceAll("[0-9]CMR", "[0-9] CMR");

我在结果中添加了空格,但结果变成了“theStringThat[0-9] CMRhas”,这显然不是我需要的。不知何故,我需要告诉正则表达式不要替换为“[0-9]”,而是替换它最初匹配的任何内容。

我知道我做错了,但我不知道什么是对的。

任何帮助表示赞赏。

谢谢,

汤姆

【问题讨论】:

标签: java regex


【解决方案1】:

你想使用capturing group

replaceAll("([0-9])CMR", "$1 CMR")

$1 引用匹配中的第一组,用括号表示。

另外,[0-9] 可以替换为 \d

【讨论】:

  • 你能添加一些描述和说明来解释它是如何工作的吗?作为一个 Java 初学者不会明白你在输入什么。
  • 完美答案,@shmosel。不仅展示了解决方案,还包括描述的名称和 url,我可以在其中深入了解该主题。非常感谢!
【解决方案2】:

试试这个:

replaceAll("(?<=\\d)(?=\\D)"," ")

它对非数字字符使用前瞻,对数字字符使用负前瞻。

如果您只想在数字后使用 CMR,请使用:

"(?<=\\d)(?=CMR)"

【讨论】:

    【解决方案3】:

    您应该对数字正则表达式和调用参数进行分组。你的代码在这里:

    replaceAll("([0-9])CMR", "$1 CMR");
    

    更多正则表达式知识,请阅读本文档 https://www.tutorialspoint.com/java/java_regular_expressions.htm

    祝你好运!

    【讨论】:

      【解决方案4】:

      阅读正则表达式可能是一个很好的起点:http://www.regular-expressions.info/java.html

      在这个站点上,替换字符串页面在这里:http://www.regular-expressions.info/replacetutorial.html

      带有数字的$代表一个完整的正则表达式匹配,你可以用这些来指代你在做什么

          String testString = "theStringThat0CMRhas";
          String resultString = testString.replaceAll("[0-9]CMR","$0");
          System.out.println(resultString);
      

      这将导致答案:theStringThat0CMR 有

      你显然不想要这个,所以让我们稍微改变一下答案

          String testString = "theStringThat0CMRhas";
          String resultString = testString.replaceAll("([0-9])CMR","$0 CMR");
          System.out.println(resultString);
      

      现在我们引用括号,它还没有做任何事情,所以它用相同的东西替换它找到的东西,一个空格和 CMR

      您现在的结果将是:theStringThat0CMR CMRhas

      所以让我们参考我们选择数字的部分

          String testString = "theStringThat0CMRhas";
          String resultString = testString.replaceAll("([0-9])CMR","$1 CMR");
          System.out.println(resultString);
      

      现在您的答案将是:theStringThat0 CMRhas

      它正在查找它选择了一个数字的位置,将其替换为该数字、一个空格,然后是 CMR

      尽管我不确定,但您正在尝试做我认为被称为反向引用的事情。正则表达式也不是我的强项。

      【讨论】:

        猜你喜欢
        • 2014-08-25
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 2010-10-04
        • 2018-07-13
        • 2015-11-30
        • 2021-11-29
        相关资源
        最近更新 更多