让我们考虑以下示例:
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()
答案 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>
希望它有所帮助。