簡體   English   中英

在java中將正則表達式模式替換為小寫

[英]Replace regex pattern to lowercase in java

我正在嘗試將 url 字符串替換為小寫,但希望保持特定模式字符串的原樣。

例如:對於輸入,如:

http://BLABLABLA?qUERY=sth&macro1=${MACRO_STR1}&macro2=${macro_str2}

預期的輸出將是小寫的 url 但多個宏是原始的:

http://blablabla?query=sth&macro1=${MACRO_STR1}&macro2=${macro_str2}

我試圖使用正則表達式捕獲字符串,但沒有找到進行替換的正確方法。 此外,似乎使用 replaceAll() 不能完成這項工作。 請問有什么提示嗎?

看起來您想將${...}內的所有大寫字符更改為小寫形式。

與構造

Matcher matcher = ...

StringBuffer buffer = new StringBuffer();
while (matcher.find()){
    String matchedPart = ...
    ...
    matcher.appendReplacement(buffer, replacement); 
}
matcher.appendTail(buffer);
String result = buffer.toString();

或者從Java 9開始,我們可以使用Matcher#replaceAll​(Function<MatchResult,String> replacer)並將其重寫為

String replaced = matcher.replaceAll(m -> {
    String matchedPart = m.group();
    ...
    return replacement;
});

您可以基於matchedPart動態構建replacement

因此,您可以讓您的正則表達式首先嘗試匹配${...} ,然后再進行匹配(當${..}不匹配時,因為不會在其之前放置正則表達式光標),讓它匹配[AZ] 在遍歷匹配項時,如果要使用use替代其小寫形式或原始形式,則可以根據匹配結果(例如其長度或是否以$開頭)進行決定。

BTW正則表達式引擎允許我們將replacement零件$x (其中x是組ID)或${name} (其中name稱為group)放置在replacement零件中,以便我們可以重復使用那些匹配的零件。 但是,如果我們想將${..}作為文字替換,則需要轉義\\$ Matcher.quoteReplacement手動進行操作,我們可以使用Matcher.quoteReplacement

演示:

String yourUrlString = "http://BLABLABLA?qUERY=sth&macro1=${MACRO_STR1}&macro2=${macro_str2}";

Pattern p = Pattern.compile("\\$\\{[^}]+\\}|[A-Z]");
Matcher m = p.matcher(yourUrlString);

StringBuffer sb = new StringBuffer();
while(m.find()){
    String match = m.group();
    if (match.length() == 1){
        m.appendReplacement(sb, match.toLowerCase());
    } else {
        m.appendReplacement(sb, Matcher.quoteReplacement(match));
    }
}
m.appendTail(sb);
String replaced = sb.toString();
System.out.println(replaced);

或在Java 9中

String replaced = Pattern.compile("\\$\\{[^}]+\\}|[A-Z]")
        .matcher(yourUrlString)
        .replaceAll(m -> {
            String match = m.group();
            if (match.length() == 1)
                return match.toLowerCase();
            else
                return Matcher.quoteReplacement(match); 
        });
System.out.println(replaced);

輸出: http://blablabla?query=sth&macro1=${MACRO_STR1}&macro2=${macro_str2}

此正則表達式將匹配第一個&macro之前的所有字符,並將所有內容放在http://和第一個&macro ,以便將其修改。

http://(.*?)&macro

在這里測試

更新:如果您不想使用組,則此正則表達式將僅匹配http://和第一個&macro之間的字符

(?<=http://)(.*?)(?=&macro)

在這里測試

一樣簡單,這需要一些編碼。 將整個url分成幾部分,直到marcos並降低字符串1變量,並將所有其他restg宏字符串附加到該變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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