【问题标题】: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));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-18
          • 2022-01-22
          • 2012-08-30
          • 2020-11-13
          相关资源
          最近更新 更多