3

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

想象一下,我有一个带有名为“id”的查询参数的 url,类似于以下任何格式

  • xxxxxxxxxxxxx?id=123
  • xxxxxxxxxxxx?id=123&xxxxxxxx
  • xxxxxxxxxxxxx?xxxxxx&id=123
  • xxxxxxxxxxxx?xxxxxx&id=123&xxxxx

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

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

  • xxxxxxxxxxxxx
  • xxxxxxxxxxxxx?xxxxxxxxx
  • xxxxxxxxxxxxx?xxxxxx
  • xxxxxxxxxxxx?xxxxxx&xxxxx

任何人都可以有一个好主意吗?(仅使用字符串操作,没有任何实用程序类)

4

4 回答 4

5

您可以使用replaceAllwhich 正在使用正则表达式,如下所示:

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_]

于 2018-04-20T06:24:37.440 回答
1

没有正则表达式的另一种方法:

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
于 2018-04-20T06:38:39.320 回答
0

你可以试试下面的代码:

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));
于 2018-04-20T08:01:40.883 回答
0

下面的代码对我有用。希望这可以帮助。

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:请忽略静态。

于 2018-04-20T06:44:50.733 回答