【问题标题】:Regex replace the substitution string正则表达式替换替换字符串
【发布时间】:2018-07-13 19:00:45
【问题描述】:

让我们考虑以下示例:

String s = str.replaceAll("regexp", "$1");

某些语言允许我们指定\U$1 来代替$1,这会将匹配的组转换为大写字母。如何使用 Java 实现相同的目标?

我知道我们可以使用 Pattern 类并获取组并将其转换为大写,但这不是我想要的。我只想更改 $1 以完成工作。

我也试过了:

String s = str.replaceAll("regexp", "$1".toUpperCase());

但看起来 "$1".toUpperCase()"$1" 而不是匹配项。我确认使用:

String s = str.replaceAll("regexp", method("$1"));

// method declared as method()
private static String method(String s) {
    System.out.println(s); // prints "$1"
    return s;
}

在 Java 中甚至允许吗?

编辑:

String s = "abc";
System.out.println(s.replaceAll("(a)", "$1")); // should print "Abc"

编辑可能的欺骗:

我不是在寻找使用m.group() 的方法,是否可以使用\U$1 之类的东西代替$1replaceAll()

【问题讨论】:

  • 请提供开始和结束的结果。
  • @Black.Jack 我已经更新了问题
  • 无法与 toUppercase() 区别
  • 致@Maroun,我知道这不会被标记给你,但如果你正确阅读了我的问题,你就不会将此标记为骗子。
  • 这个问题很简单,我正在寻找简洁的版本。

标签: java regex


【解决方案1】:

从 Java 9 开始,我们可以提供 FunctionMatcher#replaceAll(Function<MatchResult,​String> replacer)。它比这里的其他答案更简洁。例如:

Pattern.compile("regexp")
       .matcher(str)
       .replaceAll(mr -> mr.group().toUpperCase());

我们可以完全自定义此行为,因为我们持有MatchResult

Pattern.compile("regexp")
       .matcher(str)
       .replaceAll(mr -> {
                String.format("%s %s", 
                              mr.group(1).toUpperCase),
                              mr.group(2).indent(4);
                   });

【讨论】:

    【解决方案2】:

    \\U 没有在 java 正则表达式 AFAIK 中实现,你不能用这样的正则表达式来实现(.NET 有它 IIRC)。这有点冗长,但一种方法是:

        String test = "abc";
        Pattern p = Pattern.compile("(a)");
        Matcher m = p.matcher(test);
    
        StringBuilder sb = new StringBuilder();
        if (m.find()) {
            String match = test.substring(m.start(1), m.end(1));
            m.appendReplacement(sb, match.toUpperCase());
        }
    
        m.appendTail(sb);
        System.out.println(sb.toString()); 
    

    【讨论】:

      【解决方案3】:

      我认为您应该考虑使用 Apache Commons 的 StringUtils。

      这是一个例子:

      String s = "abcad";
      
      String replacer = "a";
      
      System.out.println(StringUtils.replaceChars(s, replacer, replacer.toUpperCase()));//<--AbcAd
      

      还请考虑到这避免了您实现必然会在引擎盖下的算法,事实上项目中引入的每个 jar 库基本上都是一个新的弱点。

      这是maven依赖:

      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.7</version>
      </dependency>
      

      希望对你有帮助。

      【讨论】:

      • 当然,但是 Op 明确不想使用这种方法。
      • 如果你没有注意到,我发布了 OP。
      • 是的,如果您愿意,可以将字符串放入替换字符中。那将是一条线。所以 ?不到一行?
      • 我不明白,给我看代码。我认为你的意思是在这种情况下创建至少两个 String 对象,对吧?
      • @roundAbout 字符串无论如何都是不可变的,所以无论如何你都会创建更多实例
      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2012-04-26
      • 2021-11-29
      • 2018-04-06
      相关资源
      最近更新 更多