将正则表达式模式替换为Java中的小写

时间:2018-08-15 16:00:35

标签: java regex string replaceall

我正在尝试将url字符串替换为小写字母,但希望保留特定的模式字符串。

例如:用于输入:

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

预期的输出将是小写的url,但是多个宏是原始的:

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

我试图使用正则表达式捕获字符串,但是没有找到正确的替换方法。而且似乎使用replaceAll()不能完成任务。有什么提示吗?

3 个答案:

答案 0 :(得分:1)

您似乎想将${...}内的所有大写字符更改为小写形式。

具有构造

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

您可以基于replacement动态构建matchedPart

因此,您可以让您的正则表达式首先尝试匹配${...},然后再进行匹配(当${..}不匹配时,因为不会在其之前放置正则表达式光标),使其匹配[A-Z]。在遍历匹配项时,如果要使用use代替其小写形式或原始形式,则可以根据匹配结果(例如其长度或是否以$开头)进行决定。

BTW正则表达式引擎使我们可以放在replacement部分$x(其中x是组ID)或${name}(其中name被命名为group)中因此我们可以重用匹配的那些部分。但是,如果我们想将${..}作为文字替换,则需要转义\$。要不手动执行操作,我们可以使用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}

答案 1 :(得分:0)

此正则表达式将匹配第一个&macro之前的所有字符,并将所有内容放在http://和第一个&macro之间,以便其进行修改。

http://(.*?)&macro

Tested here

更新:如果您不想使用组,则此正则表达式将仅匹配http://和第一个&macro之间的字符

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

Tested here

答案 2 :(得分:-1)

这很简单,需要一些编码。将整个url分成几部分,直到marcos并降低字符串1变量,并将所有其他restg宏字符串附加到该变量。