正则表达式替换子串

7
让我们考虑以下例子:
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()的方法,而是想知道是否可以在replaceAll()中使用类似于\U$1代替$1的内容。


Starting text: Python is a high-level programming language that is widely used for web development, scientific computing, data analysis, artificial intelligence, and more.Ending text:Python是一种高级编程语言,广泛用于Web开发、科学计算、数据分析、人工智能等领域。 - Black.Jack
问题是:“但这不是我要找的”,因为这是在Java中实现该功能的标准方式。 - Black.Jack
1
给@Maroun,我知道这不会被标记到你,但如果你仔细阅读了我的问题,你就不会将其标记为重复。 - user7780894
@roundAbout,我已经重新开放了,但请尝试解释一下为什么它没有回答你的问题。 - Maroun
1
问题非常简单,我正在寻找简洁的方法来完成它。 - user7780894
显示剩余8条评论
3个回答

2

\\U 在 Java 正则表达式中并没有实现,因此无法通过正则表达式来实现该功能(.NET 中提供了该功能)。虽然稍微有些冗长,但其中一种实现方式是:

    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
自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);
                   });

0

我认为你应该考虑使用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明确表示不想使用那种方法。 - Black.Jack
1
如果你没有注意到,我发布了这个帖子。 - user7780894
是的,如果您喜欢,可以将字符串放在替换字符中。那将只有一行代码。所以?不到一行? - Black.Jack
我不明白,请展示给我代码。你的意思是在那种情况下至少创建两个String对象,对吗? - user7780894
@roundAbout 字符串本来就是不可变的,所以你无论如何都会创建更多的实例。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接