#c# #regex
#c# #регулярное выражение
Вопрос:
У меня есть две следующие строки
/signon/default.wl?rs=WLW11.10amp;vr=2.0amp;fn=_top
/signon/default.wl?fn=%5Ftopamp;newdoor=trueamp;rs=WLW11%2E10amp;vr=2%2
Я хотел бы сопоставить все строки, кроме тех, которые не содержат newdoor
пока у меня есть следующее регулярное выражение
/signon/default.wl?(?=[w]*)(?!newdoor)
но оно соответствует всем строкам. кто-нибудь может указать, что я делаю неправильно.
Комментарии:
1. Какой язык вы используете?
2. .net, но в настоящее время я тестирую gskinner.com/RegExr
Ответ №1:
Вы можете попробовать это /signon/default.wl?(?!.*newdoor).*
Он утверждает, используя отрицательный прогноз, что newdoor
во входной строке нет вхождения. Код будет выглядеть следующим образом
resultString = Regex.Match(subjectString, @"/signon/default.wl?(?!.*newdoor).*",
RegexOptions.IgnoreCase).Value;
Комментарии:
1. оба предложения работают, но я использую эту версию, поскольку мне просто нужно протестировать строку, а затем получить содержимое.
2. 1, но имейте в виду, что вы могли бы использовать
Regex.IsMatch()
логическое значение напрямую. Кроме того,Multiline
опция не делает ничего полезного в этом случае.3. @AlanMoore Спасибо, что указали. Удалена
Multiline
опция.
Ответ №2:
/signon/default.wl?(?=[w]*)(?!newdoor)
Оба (?=)
и (?!)
являются утверждениями нулевой ширины, которые не потребляют никакого ввода. Попробуйте:
/signon/default.wl?(.(?!newdoor))*$
Комментарии:
1. -1. В первом регулярном
(?=[w]*)
выражении всегда будет успешным, потому[w]*
что может соответствовать нулевым символам; и(?!newdoor)
применяется только один раз, сразу после?
. Второе регулярное выражение соответствует неправильно/signon/default.wl?newdoor
, потому что точка используетn
innewdoor
до того, как поисковая система сможет ее остановить. Это допустимый метод, но вы должны ставить точку после заголовка:(?:(?!newdoor).)*
. (Я часто вижу эту ошибку.)
Ответ №3:
почему бы не использовать что-то вроде:
subjectString.contains("newdoor");