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

clo*_*her 1 java regex string spring

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

/fr/hello?language=en
Run Code Online (Sandbox Code Playgroud)

要么

/fr/welcome?param1=222&param2=aloa&language=en
Run Code Online (Sandbox Code Playgroud)

要么

/it/welcome?param1=222&language=en&param2=aa
Run Code Online (Sandbox Code Playgroud)

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

/fr/hello
Run Code Online (Sandbox Code Playgroud)

/fr/welcome?param1=222&param2=aloa
Run Code Online (Sandbox Code Playgroud)

/it/welcome?param1=222&param2=aa
Run Code Online (Sandbox Code Playgroud)

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

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

Avi*_*Raj 6

使用下面的正则表达式并用空字符串替换匹配的字符串,

[&?]language.*?(?=&|\?|$)
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

输出:

/fr/welcome?param1=222&param2=aloa
/fr/welcome
/fr/welcome?param1=222&param2=aa
Run Code Online (Sandbox Code Playgroud)

IDEONE 1IDEONE 2

  • 不适用于`/ it/welcome?language = en&param1 = 222`最终为`/ it/welcome&param1 = 222`(查询不再以?开头).作为一个解决方案,可以在第一步中在`?`之后拆分查询字符串,然后使用`[&] language.*?(?=&| \?| $)`替换查询字符串,然后使用`path +"再次构建完整的URL?" + replacementQuery`. (2认同)

The*_*ind 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, ""));
}
Run Code Online (Sandbox Code Playgroud)

o/p:

/fr/welcome
/fr/welcome?param1=222&param2=aloa
/fr/welcome?param1=222&param2=aa
Run Code Online (Sandbox Code Playgroud)