我有一个查询字符串,可能是:
/fr/hello?language=en
或
/fr/welcome?param1=222¶m2=aloa&language=en
或
/it/welcome?param1=222&language=en¶m2=aa
我想从每个查询字符串中删除参数语言及其值,因此结果将是:
/fr/hello
和
/fr/welcome?param1=222¶m2=aloa
和
/it/welcome?param1=222¶m2=aa
编辑:参数值的长度可能大于2
有没有人知道在String.replaceAll([regex],[replace])中使用的任何好的正则表达式?
答案 0 :(得分:6)
使用以下正则表达式并将匹配的字符串替换为空字符串
[&?]language.*?(?=&|\?|$)
示例代码:
String s1 = "/fr/welcome?param1=222¶m2=aloa&language=en";
String s2 = "/fr/welcome?language=en";
String s3 = "/fr/welcome?param1=222&language=en¶m2=aa";
String m1 = s1.replaceAll("[&?]language.*?(?=&|\\?|$)", "");
String m2 = s2.replaceAll("[&?]language.*?(?=&|\\?|$)", "");
String m3 = s3.replaceAll("[&?]language.*?(?=&|\\?|$)", "");
System.out.println(m1);
System.out.println(m2);
System.out.println(m3);
输出:
/fr/welcome?param1=222¶m2=aloa
/fr/welcome
/fr/welcome?param1=222¶m2=aa
答案 1 :(得分:5)
您可以将regex
与replaceAll()
public static void main(String[] args) {
String s1 = "/fr/welcome?language=en";
String s2 = "/fr/welcome?param1=222¶m2=aloa&language=en";
String s3 = "/fr/welcome?param1=222&language=en¶m2=aa";
String pattern = "[?&]language=.{2}"; // use pattern = "([?&]language=\\w+)"; for more than 2 letters after language ==.
System.out.println(s1.replaceAll(pattern, ""));
System.out.println(s2.replaceAll(pattern, ""));
System.out.println(s3.replaceAll(pattern, ""));
}
o / p:
/fr/welcome
/fr/welcome?param1=222¶m2=aloa
/fr/welcome?param1=222¶m2=aa
答案 2 :(得分:1)
此正则表达式可以帮助您:
"language=\\w{2}"
答案 3 :(得分:1)
我想从每个查询字符串中删除参数语言 它的价值,......
您可以使用replaceAll
。
String s="/fr/welcome?language=en";
s=s.replaceAll("(\\?|&)language=\\w+", "");
(\\?|&)
群组将与?
或&
\\w+
将匹配一个或多个单词字符答案 4 :(得分:0)
这将正确删除任何参数,即使它被放置多个(例如=“/ fr / welcome?language = en& param1 = 222& param2 = aloa”)
public String removeParamFromUrl(final String url, final String param) {
if (StringUtils.isNotBlank(url)) {
return url.replaceAll("&" + param + "=[^&]+", "")
.replaceAll("\\?" + param + "=[^&]+&", "?")
.replaceAll("\\?" + param + "=[^&]+", "");
} else {
return url;
}
}
答案 5 :(得分:0)
与其使用正则表达式,不如使用专用的 URI 操作 API 来删除查询参数。 Spring UriComponentsBuilder
类可用于删除给定的查询参数,保留其余部分。我假设 Spring 特定的解决方案是可以接受的,因为这个问题用 spring 标记。
private static String removeQueryParam(String url) {
return UriComponentsBuilder.fromUriString(url)
.replaceQueryParam("language")
.build()
.toUriString();
}
从所问的问题来看,不清楚为什么或是否需要使用 String.replaceAll
的基于正则表达式的解决方案,或者是否可以接受任何基于 Java 或 Spring 的解决方案。换句话说,这可能是一个 XY problem,其目标是删除“语言”查询参数,同时保留所有其他查询参数,并且没有特殊原因需要在解决方案中使用正则表达式。