簡體   English   中英

正則表達式替換替換字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM