组匹配toUpperCase()

时间:2018-02-03 11:31:40

标签: java

让我们考虑以下示例:

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"

编辑可能的DUPE:

我不是在寻找使用m.group()的方式,是否有可能使用\U$1代替$1 replaceAll()

3 个答案:

答案 0 :(得分:3)

\\U未在java regex 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()); 

答案 1 :(得分:2)

自Java 9开始,我们可以为Function提供Matcher#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 :(得分:0)

我认为你应该考虑来自Apache Commons的StringUtils。

这是一个例子:

String s = "abcad";

String replacer = "a";

System.out.println(StringUtils.replaceChars(s, replacer, replacer.toUpperCase()));//<--AbcAd

请注意,这可以避免你实现必然会在幕后的algorythm,并且项目中引入的每个jar库基本上都是一个新的弱点。

这是maven依赖:

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

希望它有所帮助。