【问题标题】:remove query parameter with java string operations使用 java 字符串操作删除查询参数
【发布时间】:2018-09-30 18:55:54
【问题描述】:
我有一个简单的问题,但尚未找到最佳解决方案。
想象一下,我有一个带有名为“id”的查询参数的 url,类似于以下任何格式
- xxxxxxxxxxxxxxx?id=123
- xxxxxxxxxxxxxx?id=123&xxxxxxxx
- xxxxxxxxxxxx?xxxxxx&id=123
- xxxxxxxxxxxx?xxxxxx&id=123&xxxxx
我将上面的字符串(可以是上面的任何一个)作为字符串参数,想找出最简单的方法来删除查询参数id(名称和值),这样即使在删除之后,它也会是一个有效的网址。
以下是我的预期输出(按顺序)。
- xxxxxxxxxxxxxxx
- xxxxxxxxxxxx?xxxxxxxxx
- xxxxxxxxxxxx?xxxxxx
- xxxxxxxxxxxx?xxxxxx&xxxxxx
任何人都可以有一个好主意吗? (只有字符串操作,没有任何实用程序类)
【问题讨论】:
标签:
java
string
url
query-parameters
string-operations
【解决方案1】:
您可以使用replaceAll,它正在使用正则表达式:
String[] urls = new String[]{
"xxxxxxxxxxxxx?id=123", "xxxxxxxxxxxxx?id=123&xxxxxxxx",
"xxxxxxxxxxxxx?xxxxxx&id=123", "xxxxxxxxxxxxx?xxxxxx&id=123&xxxxx"
};
for (String url : urls) {
System.out.println(
url.replaceAll("([\\?&]id=\\d+$)|(id=\\d+&)", "")
);
}
输出
xxxxxxxxxxxxx
xxxxxxxxxxxxx?xxxxxxxx
xxxxxxxxxxxxx?xxxxxx
xxxxxxxxxxxxx?xxxxxx&xxxxx
Demo
Regex demo
详情
这个正则表达式([\?&]id=\d+$)|(id=\d+&) 表示匹配:
-
([\?&]id=\d+$)第一组
-
[\?&] 匹配文字 ? 或 & 字符
-
id 后跟文字 id 字
-
\d+ 后跟一位或模式数字
-
$ 行尾
-
| 或
-
(id=\d+&)比赛组二
-
id 匹配文字 id 单词
-
\d+ 后跟一位或模式数字
-
& 匹配文字 & 字符
如果您在id= 之后输入的不是数字,您可以使用\w 代替它匹配可以匹配[A-Za-z0-9_] 中任何字符的\w 单词字符
【解决方案2】:
另一种没有正则表达式的方法:
String removeParameter(String url, String paramToRemove) {
String[] parts = url.split("\\?");
if (parts.length == 2) {
String base = parts[0];
String params = parts[1];
return base + "?" + Stream.of(params.split("&"))
.map(p -> p.split("="))
.filter(p -> !p[0].equals(paramToRemove))
.map(p -> String.join("=", p))
.collect(Collectors.joining("&"));
} else {
return url;
}
}
并像这样使用它:
removeParameter("xxxxxxxxxxxxx?xxxxxx&id=123", "id") // xxxxxxxxxxxxx?xxxxxx
【解决方案3】:
以下代码对我有用。希望这会有所帮助。
public class A {
public static void main(String[] args) {
String s = "xxxxxxxxxxxxx?id=123";
String s1 = "xxxxxxxxxxxxx?id=123&xxxxxxxx";
s = getIdRemovedString(s);
s1 = getIdRemovedString(s1);
System.out.println(s);
System.out.println(s1);
}
private static String getIdRemovedString(String s) {
int startIndex = s.indexOf("?id") - 1;
int endIndex = s.indexOf("&", s.indexOf("?id"));
String idSubString = s.substring(startIndex, endIndex == -1 ? s.length() : endIndex);
return s.replace(idSubString, "");
}
}
PS:请忽略静态。
【解决方案4】:
你可以试试下面的代码:
String finalStr =request.getRequestURL()+"?";
String params[] = request.getQueryString().split("&");
for (String p : params) {
String values[] = p.split("=");
if(values.length == 2) {
finalStr= finalStr + values[1]+"&";
}else {
finalStr= finalStr + values[0]+"&";
}
}
System.out.println("output"+finalStr.substring(0, finalStr.length()-1));