使用 java 字符串操作删除查询参数
remove query parameter with java string operations
我有一个简单的问题,但尚未找到最佳解决方案。
假设我有一个 url 和一个名为 'id' 的查询参数,类似于以下任何一种格式
- xxxxxxxxxxxxx?id=123
- xxxxxxxxxxxxx?id=123&xxxxxxxx
- xxxxxxxxxxxxx?xxxxxx&id=123
- xxxxxxxxxxxxx?xxxxxx&id=123&xxxxx
我将上面的字符串(可以是上面的任何一个)作为字符串参数,并想找出删除查询参数 id(名称和值)的最简单方法,这样即使在删除之后,它将是一个有效的 url.
以下是我的预期输出(按顺序)。
- xxxxxxxxxxxxx
- xxxxxxxxxxxxx?xxxxxxxx
- xxxxxxxxxxxxx?xxxxxx
- xxxxxxxxxxxxx?xxxxxx&xxxxx
谁有好主意吗? (仅对String操作,不带任何util类)
您可以使用 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
详情
这个正则表达式 ([\?&]id=\d+$)|(id=\d+&)
意味着匹配 :
([\?&]id=\d+$)
第一组
[\?&]
匹配文字 ?
或 &
字符
id
后跟文字 id
字
\d+
后跟一个或模式数字
$
行尾
|
或
(id=\d+&)
匹配组二
id
匹配文字 id
字
\d+
后跟一个或模式数字
&
匹配文字 &
字符
如果你在 id=
之后输入的不是数字你可以使用 \w
代替它匹配 \w 可以匹配 [A-Za-z0-9_]
[=34 中的任何字符的单词字符=]
另一种没有正则表达式的方法:
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
下面的代码适合我。希望这有帮助。
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: 请忽略静电。
您可以试试下面的代码:
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));
我有一个简单的问题,但尚未找到最佳解决方案。
假设我有一个 url 和一个名为 'id' 的查询参数,类似于以下任何一种格式
- xxxxxxxxxxxxx?id=123
- xxxxxxxxxxxxx?id=123&xxxxxxxx
- xxxxxxxxxxxxx?xxxxxx&id=123
- xxxxxxxxxxxxx?xxxxxx&id=123&xxxxx
我将上面的字符串(可以是上面的任何一个)作为字符串参数,并想找出删除查询参数 id(名称和值)的最简单方法,这样即使在删除之后,它将是一个有效的 url.
以下是我的预期输出(按顺序)。
- xxxxxxxxxxxxx
- xxxxxxxxxxxxx?xxxxxxxx
- xxxxxxxxxxxxx?xxxxxx
- xxxxxxxxxxxxx?xxxxxx&xxxxx
谁有好主意吗? (仅对String操作,不带任何util类)
您可以使用 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
详情
这个正则表达式 ([\?&]id=\d+$)|(id=\d+&)
意味着匹配 :
([\?&]id=\d+$)
第一组[\?&]
匹配文字?
或&
字符id
后跟文字id
字\d+
后跟一个或模式数字$
行尾
|
或(id=\d+&)
匹配组二id
匹配文字id
字\d+
后跟一个或模式数字&
匹配文字&
字符
如果你在 id=
之后输入的不是数字你可以使用 \w
代替它匹配 \w 可以匹配 [A-Za-z0-9_]
[=34 中的任何字符的单词字符=]
另一种没有正则表达式的方法:
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
下面的代码适合我。希望这有帮助。
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: 请忽略静电。
您可以试试下面的代码:
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));