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

#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 in newdoor до того, как поисковая система сможет ее остановить. Это допустимый метод, но вы должны ставить точку после заголовка: (?:(?!newdoor).)* . (Я часто вижу эту ошибку.)

Ответ №3:

почему бы не использовать что-то вроде:

 subjectString.contains("newdoor");