从查询字符串中删除请求参数

时间:2014-07-16 11:47:15

标签: java regex string spring

我有一个查询字符串,可能是:

/fr/hello?language=en

/fr/welcome?param1=222&param2=aloa&language=en

/it/welcome?param1=222&language=en&param2=aa

我想从每个查询字符串中删除参数语言及其值,因此结果将是:

/fr/hello

/fr/welcome?param1=222&param2=aloa

/it/welcome?param1=222&param2=aa

编辑:参数值的长度可能大于2

有没有人知道在String.replaceAll([regex],[replace])中使用的任何好的正则表达式?

6 个答案:

答案 0 :(得分:6)

使用以下正则表达式并将匹配的字符串替换为空字符串

[&?]language.*?(?=&|\?|$)

DEMO

示例代码:

String s1 = "/fr/welcome?param1=222&param2=aloa&language=en";
String s2 = "/fr/welcome?language=en";
String s3 = "/fr/welcome?param1=222&language=en&param2=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&param2=aloa
/fr/welcome
/fr/welcome?param1=222&param2=aa

IDEONE 1IDEONE 2

答案 1 :(得分:5)

您可以将regexreplaceAll()

一起使用
public static void main(String[] args) {
    String s1 = "/fr/welcome?language=en";
    String s2 = "/fr/welcome?param1=222&param2=aloa&language=en";
    String s3 = "/fr/welcome?param1=222&language=en&param2=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&param2=aloa
/fr/welcome?param1=222&param2=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 特定的解决方案是可以接受的,因为这个问题用 标记。

private static String removeQueryParam(String url) {
    return UriComponentsBuilder.fromUriString(url)
            .replaceQueryParam("language")
            .build()
            .toUriString();
}

从所问的问题来看,不清楚为什么或是否需要使用 String.replaceAll 的基于正则表达式的解决方案,或者是否可以接受任何基于 Java 或 Spring 的解决方案。换句话说,这可能是一个 XY problem,其目标是删除“语言”查询参数,同时保留所有其他查询参数,并且没有特殊原因需要在解决方案中使用正则表达式。