使用 java 字符串操作删除查询参数

remove query parameter with java string operations

我有一个简单的问题,但尚未找到最佳解决方案。

假设我有一个 url 和一个名为 'id' 的查询参数,类似于以下任何一种格式

我将上面的字符串(可以是上面的任何一个)作为字符串参数,并想找出删除查询参数 id(名称和值)的最简单方法,这样即使在删除之后,它将是一个有效的 url.

以下是我的预期输出(按顺序)。

谁有好主意吗? (仅对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

Demo

Regex demo


详情

这个正则表达式 ([\?&]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));