2012-01-31 4 views
0

Я пытаюсь найти строку, которая не содержит одну и ту же подстроку. Это мой код:Строка соответствия регулярных выражений, которая не содержит подстроку

var regex = new Regex(@"aaa(?!.*aaa).*aaa"); 
var str1 = @"aaa aaa aaa"; 
var match = regex.Match(str1); // no 
var str1 = @"aaa bbb aaa"; 
var match = regex.Match(str1); // yes 

Но этот код не работает ... Что я делаю неправильно?

Спасибо!

+0

Не понимаю ... – Soony

+0

Так '«аа»' также должны быть отклонены? В конце концов, он содержит две подстроки '' a''. Если нет, вам нужно объяснить это немного лучше. –

+0

Чтобы ответить на ваш вопрос, можно было бы более четко разъяснить, что вы хотите, чтобы шаблон соответствовал и не соответствовал, и какие значения являются переменными во входной строке. –

ответ

7

Вы хотите выражение, как это:

aaa(?:(?!aaa).)*aaa 

(?:(?!aaa).)* Удачные строки, которые не содержат aaa (полностью или частично).

Вы также можете написать это:

aaa(?:[^a]+|a(?!aa))*aaa 
+0

Спасибо, это идеальное решение, я использовал его так^aaa (? :(?! aaa).) * Aaa $ – xtmq

0

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

т.е.

`\b(\w+)\s+(?!\1\b)` 

Матчи слово \b(\w+) Вслед за пробельным \s+ Вслед отрицательным прогнозным для задней ссылки на ранее согласованное слово. (?!\1\b)

[Test] 
public void RegexTest() 
{ 
    var regex = new Regex(@"\b(\w+)\s+(?!\1\b)"); 
    var str1 = @"aaa aaa aaa"; 
    Assert.IsFalse(regex.IsMatch(str1)); // no 
    var str2 = @"aaa bbb aaa"; 
    Assert.IsTrue(regex.IsMatch(str2)); // yes 
} 
Смежные вопросы