[英]Regex replace the substitution string
讓我們考慮以下示例:
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
代替replaceAll()
來替代$1
\\\\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());
從Java 9開始,我們可以為Matcher#replaceAll(Function<MatchResult,String> replacer)
提供一個Function
。 比這里的其他答案更簡潔。 例如:
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);
});
我認為您應該考慮使用Apache Commons的StringUtils。
這是一個例子:
String s = "abcad";
String replacer = "a";
System.out.println(StringUtils.replaceChars(s, replacer, replacer.toUpperCase()));//<--AbcAd
Pls還認為這避免了您實施必須在幕后的算法,並且項目中引入的每個jar庫基本上都是一個新的弱點。
這是Maven依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.