2013-04-19 3 views
0

У меня есть строка поиска и используйте регулярное выражение, чтобы найти мне все, что не равно ему.Как мне получить?! regex для правильной работы?

т.е. как этот

string searchStr = SearchStr; 
searchStr = System.Text.RegularExpressions.Regex.Escape(searchStr). 
    Replace(@"\*", ".+"). 
    Replace(@"\?", "."); 
//if (searchStr.StartsWith("!"))//(?!hede).) 
// searchStr = "?!" + searchStr.Substring(1); 

тогда я Regex.IsMatch, но я не могу получить ?! сделать не следующий шаблон, любые идеи?

+1

Для начала lookaheads и просмотра назад, должны быть заключены в квадратные скобки, например, '(?! Dontcontainme)' – Patashu

ответ

1

Если я правильно понял вас, вы не можете просто добавить?! вначале вам нужно будет создать группу с отрицательным выражением, и в зависимости от того, что/как вы ищете, вы хотите привязать ее. Нечто подобное может работать в зависимости от того, что вы делаете:

searchStr = "^(?!" + searchStr.Substring(1) + "$).*"; 

Это, вероятно, будет легче отрицать результат регулярных выражений, хотя:

Regex r = new Regex(..); 
Match m = r.Match(someText); 
if (m.Success != searchStr.StartsWith("!")) { 
    // matches! 
} 

Вы бы хотели регулярное выражение, чтобы добиться успеха (возвращение true), когда .StartsWith("!"): false и наоборот.

+0

спасибо вам говорят просто инвертировать результат заставил меня прут его, BOOL invertSearch = searchStr.StartsWith (» ! "); if (invertSearch) searchStr = searchStr.Substring (1); if (Regex.IsMatch (nd.Text, searchStr, RegexOptions.IgnoreCase)^invertSearch) – f1wade

0

Если вы хотите, чтобы искать слова, которые не равны something, попробуйте:

\b(?!something\b)\w+\b 

И строить его программно:

String.Format(@"\b(?!{0}\b)\w+\b", Regex.Escape(negativeSearchStr)) 

Объяснение:

\b\w+\b 

является образец для слов

(?!something) 

является негативным взглядом вперед, слово не начинается с something. И, наконец:

(?!something\b) 

является отрицательным упреждающим, что слово не равно something.

0

Если вы хотите избежать строк, которые не начинаются с термина, вы будете использовать lookbehind. Lookbehinds и lookaheads должны быть заключены в круглые скобки. Прямо сейчас, похоже, вы просто выполняете литеральный поиск, если вы не добавляете круглые скобки, так как вы ищете строку, на которой есть вопросительный знак и восклицательный знак.

Итак, у нас есть строки «abc» и «bbc», и мы хотим найти строку, которая не начинается с a. Регулярное выражение lookbehind будет выглядеть так.

(?<!a)b 
Смежные вопросы