Если вы хотите сделать это в одном регулярном выражении, вы можете сделать это:
/&foo(=[^&]*)?|^foo(=[^&]*)?&?/
Это потому, что вам нужно сопоставить либо амперсанд перед foo = ..., либо один после или ни того, ни другого, но не сразу.
Если честно, я думаю, что лучше так, как вы это сделали: удалить конечный амперсанд на отдельном этапе.
/(?<=&|\?)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"
Наличие строки запроса, начинающейся с &
, безвредно - почему бы не оставить это так? В любом случае я предлагаю вам найти конечный амперсанд и использовать \ b
, чтобы сопоставить начало foo без предшествующего символа:
/\bfoo\=[^&]+&?/
Есть также мой инструмент с открытым исходным кодом, padb, который помогает в параллельном программировании. Я называю это «Инструмент проверки работы», поскольку он работает не только как отладчик, но также может функционировать, например, как параллельная программа, подобная верхней. Запустите в режиме «Полный отчет», он покажет вам стек трассировки каждого процесса в вашем приложении вместе с локальными переменными для каждой функции по каждому рангу (при условии, что вы скомпилированы с -g). Он также покажет вам «очереди сообщений MPI», то есть список ожидающих отправки и получения для каждого ранга в рамках задания.
Помимо отображения полного отчета, также можно указать padb увеличивать отдельные изображения. биты информации в задании, существует множество опций и элементов конфигурации для управления отображаемой информацией,
Спасибо. Да, для экранирования используется обратная косая черта, и вы правы, мне не нужны /.
Кажется, это работает, хотя не в одну строку, как было указано в исходном вопросе.
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;
}