2015-07-17 3 views
1

Например, есть несколько предложений:Каждое ключевое слово должно присутствовать

хх, полученные 2, посланные от 1
уу, полученных на 3, посланные от 1
ZZ, полученного 1, посланные от 3
аа, полученные 4 посланы от 1

Как я могу найти все предложения содержит 1и3?

мне нужен результат, чтобы быть

уу, полученные 3 посланы от 1
ZZ, полученного 1 посланы от 3

в этом случае.

Ближайший я пробовал Regex r = new Regex (".*(3).*(1).*");, но, очевидно, это не решение.

+2

Вы можете использовать '^ (? =. * 1). * 3. * $' Regex. –

+0

@ УлугбекУмиров проклятый, он работает! Кроме того, не могли бы вы дать некоторое объяснение логике? если это так, это будет большой помощью, спасибо! –

ответ

3

Вы можете использовать LINQ вместо регулярных выражений:

var strs = new string[] { "xx received by 2 sent from 1", 
"yy received by 3 sent from 1", 
"zz received by 1 sent from 3", 
"aa received by 4 sent from 1" }; 
var myres = strs.Where(p => p.Contains("1") && p.Contains("3")).ToList(); 

enter image description here

Если вы предпочитаете Regex подход (это будет медленнее):

^(?=.*1)(?=.*3).* 

См demo (если вы хотите для использования IsMatch(), вам не нужно .* в конце рисунка).

var rx = new Regex(@"^(?=.*1)(?=.*3)"); 
var myres2 = strs.Where(p => rx.IsMatch(p)).ToList(); 

Регулярное выражение соответствует

  • ^ - начало строки, а затем ...
  • (?=.*1) - убеждается есть по крайней мере один 1 от начала строки
  • (?=.*3) - убедитесь, что по крайней мере один 3 (еще раз!) с начала строки.

(?=...) конструкция знает как положительный смотреть вперед, один из так называемых look-arounds:

Lookaround фактически соответствует символам, но затем отдает матч, возвращая только результат : совпадение или отсутствие соответствия.

Таким образом, если у вас есть 2 взгляда вперед, они все «запускаются» в одном месте во входной строке, и у нас есть логический И так. Узнайте больше об этом в Lookarounds Stand their Ground.

+0

Отлично, именно то, что я пытался сделать. Но не могли бы вы дать некоторое объяснение о '? =', Regex игнорировать заказ, который вы заявляете? Я имею в виду, вы пишете '1' перед' 3', но он знает, что найти '3' перед' 1'? Кроме того, почему существует необходимость в '' '? Благодаря! –

+1

:) Я писал свое объяснение, когда вы добавили свой комментарий. Я добавлю больше, поскольку вы заинтересованы. –

+0

Спасибо! Так в чем разница с '^ (? =. * 1). * 3. * $'? Это тоже работает (хотя я предпочитаю ваше решение, оно выглядит даже для '1' и' 3' lol) –

0

Вы можете посмотреть на 3 с последующим 1 на ту же линию, или 1, за которым следует 3 с регулярным выражением

^.*?((3)(?=.*?1)|(1)(?=.*?3)).*$ 

Regular expression visualization

Debuggex Demo

Смежные вопросы