我正在尝试将url字符串替换为小写字母,但希望保留特定的模式字符串。
例如:用于输入:
http://BLABLABLA?qUERY=sth¯o1=${MACRO_STR1}¯o2=${macro_str2}
预期的输出将是小写的url,但是多个宏是原始的:
http://blablabla?query=sth¯o1=${MACRO_STR1}¯o2=${macro_str2}
我试图使用正则表达式捕获字符串,但是没有找到正确的替换方法。而且似乎使用replaceAll()不能完成任务。有什么提示吗?
答案 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¯o1=${MACRO_STR1}¯o2=${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¯o1=${MACRO_STR1}¯o2=${macro_str2}
答案 1 :(得分:0)
此正则表达式将匹配第一个¯o
之前的所有字符,并将所有内容放在http://
和第一个¯o
之间,以便其进行修改。
http://(.*?)¯o
更新:如果您不想使用组,则此正则表达式将仅匹配http://
和第一个¯o
之间的字符
(?<=http://)(.*?)(?=¯o)
答案 2 :(得分:-1)
这很简单,需要一些编码。将整个url分成几部分,直到marcos并降低字符串1变量,并将所有其他restg宏字符串附加到该变量。