Регулярное выражение для удаления одного параметра из строки запроса

Строки JavaScript действительно неизменны.

32
задан Community 23 May 2017 в 12:03
поделиться

5 ответов

Если вы хотите сделать это в одном регулярном выражении, вы можете сделать это:

/&foo(=[^&]*)?|^foo(=[^&]*)?&?/

Это потому, что вам нужно сопоставить либо амперсанд перед foo = ..., либо один после или ни того, ни другого, но не сразу.

Если честно, я думаю, что лучше так, как вы это сделали: удалить конечный амперсанд на отдельном этапе.

22
ответ дан 27 November 2019 в 21:10
поделиться
/(?<=&|\?)foo(=[^&]*)?(&|$)/

Использует ретроспективный просмотр и последнюю группу для "привязки" совпадения и допускает пропущенное значение. Измените \? на ^ , если вы уже убрали вопросительный знак из строки запроса.

Регулярное выражение по-прежнему не заменяет настоящий синтаксический анализатор строки запроса. , однако.

Обновление: Тестовый сценарий: (запустите его на codepad.org )

import re

regex = r"(^|(?<=&))foo(=[^&]*)?(&|$)"

cases = {
  "foo=123": "",
  "foo=123&bar=456": "bar=456",
  "bar=456&foo=123": "bar=456",
  "abc=789&foo=123&bar=456": "abc=789&bar=456",

  "oopsfoo=123": "oopsfoo=123",
  "oopsfoo=123&bar=456": "oopsfoo=123&bar=456",
  "bar=456&oopsfoo=123": "bar=456&oopsfoo=123",
  "abc=789&oopsfoo=123&bar=456": "abc=789&oopsfoo=123&bar=456",

  "foo": "",
  "foo&bar=456": "bar=456",
  "bar=456&foo": "bar=456",
  "abc=789&foo&bar=456": "abc=789&bar=456",

  "foo=": "",
  "foo=&bar=456": "bar=456",
  "bar=456&foo=": "bar=456",
  "abc=789&foo=&bar=456": "abc=789&bar=456",
}

failures = 0
for input, expected in cases.items():
  got = re.sub(regex, "", input)
  if got != expected:
    print "failed: input=%r expected=%r got=%r" % (input, expected, got)
    failures += 1
if not failures:
  print "Success"

Он показывает, где мой подход не удался, Марк имеет на это право - что должно показать, почему вы не следует делать этого с регулярным выражением ..: P


Проблема заключается в том, чтобы связать параметр запроса с одним амперсандом, и - если вы должны использовать регулярное выражение (если вы не уловили его: P, я бы использовал отдельный синтаксический анализатор, который может использовать внутри себя регулярное выражение, но при этом понимать формат) - одно из решений - убедиться, что там ' s ровно один амперсанд на параметр: замените ведущий ? на & .

Это дает / & foo (= [^ &] *)? (? = & | $) / , что очень просто и лучшее, что вы можете получить. Удалите ведущие & в конечном результате (или замените их на ? и т. Д.). При изменении тестового примера для этого используются те же случаи, что и выше, и изменяется цикл на:

failures = 0
for input, expected in cases.items():
  input = "&" + input
  got = re.sub(regex, "", input)
  if got[:1] == "&":
    got = got[1:]
  if got != expected:
    print "failed: input=%r expected=%r got=%r" % (input, expected, got)
    failures += 1
if not failures:
  print "Success"
6
ответ дан 27 November 2019 в 21:10
поделиться

Наличие строки запроса, начинающейся с & , безвредно - почему бы не оставить это так? В любом случае я предлагаю вам найти конечный амперсанд и использовать \ b , чтобы сопоставить начало foo без предшествующего символа:

 /\bfoo\=[^&]+&?/
4
ответ дан 27 November 2019 в 21:10
поделиться

Есть также мой инструмент с открытым исходным кодом, padb, который помогает в параллельном программировании. Я называю это «Инструмент проверки работы», поскольку он работает не только как отладчик, но также может функционировать, например, как параллельная программа, подобная верхней. Запустите в режиме «Полный отчет», он покажет вам стек трассировки каждого процесса в вашем приложении вместе с локальными переменными для каждой функции по каждому рангу (при условии, что вы скомпилированы с -g). Он также покажет вам «очереди сообщений MPI», то есть список ожидающих отправки и получения для каждого ранга в рамках задания.

Помимо отображения полного отчета, также можно указать padb увеличивать отдельные изображения. биты информации в задании, существует множество опций и элементов конфигурации для управления отображаемой информацией,

1
ответ дан 27 November 2019 в 21:10
поделиться

Спасибо. Да, для экранирования используется обратная косая черта, и вы правы, мне не нужны /.

Кажется, это работает, хотя не в одну строку, как было указано в исходном вопросе.

    public static string RemoveQueryStringParameter(string url, string keyToRemove)
    {
        //if first parameter, leave ?, take away trailing &
        string pattern = @"\?" + keyToRemove + "[^&]*&?"; 
        url = Regex.Replace(url, pattern, "?");
        //if subsequent parameter, take away leading &
        pattern = "&" + keyToRemove + "[^&]*"; 
        url =  Regex.Replace(url, pattern, "");
        return url;
    }
1
ответ дан 27 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: