【问题标题】:Replace Java Regex Capture Groups with Parts of Themselves用自身的一部分替换 Java 正则表达式捕获组
【发布时间】:2017-01-31 15:31:05
【问题描述】:

在Java中对字符串进行以下替换的最佳方法是什么:

我有类似这样的文字:

one two [[**my_word** other words]] three four [[**my_other_word** other words]] five six

我想要以下文字

one two **my_word** three four **my_other_word** five six

我尝试使用正则表达式捕获组,但如何将一个捕获组替换为另一个捕获组?

【问题讨论】:

  • 你能展示一下你尝试了什么以及你卡在哪里了吗?
  • 每个组都有一个数字 $1, $2, $3 ... 然后你就可以使用它了。 $1 = 捕获的第 1 组,例如 $1 = 马铃薯 => “hi $1”(嗨马铃薯)。
  • 我在尝试使用 Java 模式和匹配器 API 时卡住了。
  • 如果您有兴趣了解如何使用 Pattern 和 Matcher 对象,我添加了一个示例。

标签: java regex replaceall capture-group


【解决方案1】:

使用

https://www.tutorialspoint.com/java/java_string_replaceall.htm

然后做类似的事情

a.replaceAll("\\[\\[(\\w+)[^\\[]+\\]\\]", "$1");

【讨论】:

    【解决方案2】:

    根据您的需求,您可以使用类似的 oneliner

    a.replaceAll("\\[\\[(\\*\\*\\w+\\*\\*).*?\\]\\]", "$1");
    

    或者更复杂的版本,您可以控制用什么替换每个匹配项。

    String inputString = "one two [[**my_word** other words]] three four [[**my_other_word** other words]] five six";
    Pattern pattern = Pattern.compile("\\[\\[(\\*\\*\\w+\\*\\*).*?\\]\\]", Pattern.DOTALL);
    Matcher matcher = pattern.matcher(inputString);
    StringBuffer outputBuffer = new StringBuffer();
    while (matcher.find()) {
        String match = matcher.group(1);        
        matcher.appendReplacement(outputBuffer, match);
    }
    matcher.appendTail(outputBuffer);
    
    String output = outputBuffer.toString();
    

    【讨论】:

      【解决方案3】:
      a.replaceAll("\\[\\[(\\*\\*\\w+\\*\\*)(?:\\s\\w+\\s?)+\\]\\]", "$1");
      

      【讨论】:

      • 您使用的单个反斜杠在 java 中作为正则表达式转义字符无效。它们需要是双反斜杠。
      • 嘿,我只是想在你最后一个 C++ 问题上联系你。你有一个错误。 std::vector<std::string> base(values->begin() + 1, values->begin() + 4); 只为您提供前 3 个元素。您需要将 4 更改为 5 以获取前 4 个元素。
      • @NathanOliver 啊,我知道这将是一个愚蠢的错误。不知道是包容性的还是排他性的结局界限。谢谢!
      • @m_callens 没问题。一般来说,end 永远不会包含在复制的范围内。
      • 虽然您可能已经解决了这个用户的问题,但纯代码的答案对于以后遇到这个问题的用户来说并不是很有帮助。请编辑您的答案,以解释您的代码解决原始问题的原因。
      猜你喜欢
      • 1970-01-01
      • 2014-06-19
      • 2010-11-19
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2019-01-27
      相关资源
      最近更新 更多