удалить параметр запроса с помощью строковых операций Java

У меня есть простая проблема, и я еще не нашел оптимального решения.

Представьте, что у меня есть URL-адрес с параметром запроса с именем «id», как в любом из следующих форматов.

  • ххххххххххх?id=123
  • ххххххххххх?id=123&хххххххх
  • ххххххххххх?хххххх&id=123
  • ххххххххххх?хххххх&id=123&ххххх

Я беру указанную выше строку (может быть любую выше) в качестве параметра String и хочу найти самый простой способ удалить идентификатор параметра запроса (имя и значение), чтобы даже после удаления он был действительным URL-адресом .

Ниже приведены мои ожидаемые результаты (по порядку).

  • ххххххххххх
  • ххххххххххх?хххххххх
  • ххххххххххх?хххххх
  • ххххххххххх?хххххххххххх

Может у кого есть хорошая идея? (только со строковыми операциями, без каких-либо вспомогательных классов)


person Supun Wijerathne    schedule 20.04.2018    source источник
comment
Каков ожидаемый результат?   -  person YCF_L    schedule 20.04.2018
comment
@YCF_L добавил к вопросу. :))   -  person Supun Wijerathne    schedule 20.04.2018
comment
Возможный дубликат восстановления URL-адреса без параметра строки запроса   -  person Evgeny Kochergin    schedule 20.04.2018


Ответы (4)


Вы можете использовать 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+$) first group
    • [\?&] match literal ? or & character
    • id, за которым следует буквальное id слово
    • \d+, за которым следует единица или цифра режима
    • $ конец строки
  • | or
  • (id=\d+&) match group two
    • id match literal id word
    • \d+, за которым следует одна или цифра режима
    • & соответствует буквальному & символу

Если ввод после id= может быть другим, чем цифра, вы можете использовать \w вместо этого, который соответствует символу слова \w, который может соответствовать любому символу в [A-Za-z0-9_]

person YCF_L    schedule 20.04.2018

Другой подход без регулярного выражения:

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
person Krzysztof Atłasik    schedule 20.04.2018

Ниже код работает для меня. Надеюсь это поможет.

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: пожалуйста, игнорируйте статические.

person Chetan Gorkal    schedule 20.04.2018

Вы можете попробовать код ниже:

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));
person AmitD    schedule 20.04.2018