Это немного сложно и немного не в моей лиге. Я хочу отсортировать список слов и исключить те, которые не содержат определенного набора символов, однако эти символы могут быть в любом порядке, и некоторые из них могут встречаться чаще, чем другие.
Я хочу, чтобы регулярное выражение искало любые слова с помощью:
e
0 или 1 разa
0 или 1 разt
0 или 1 или 2 раза
Например, будет работать следующее:
eat
tea
tate
tt
a
e
Следующее не сработает
eats
teas
tates
ttt
aa
ee
Lookaround Regex является новым для меня, поэтому я не уверен на 100% в синтаксисе (любой ответ, использующий lookaround с объяснением, был бы потрясающим). Мое лучшее предположение на данный момент:
Regex regex = new Regex(@"(?=.*e)(?=.*a)(?=.*t)");
lines = lines.Where(x => regex.IsMatch(x)).ToArray(); //'text' is array containing words
string[]
. Таким образом, вам нужно заботиться не о сопоставлении слов, а о целых строках. 21.11.2015*
вместо+
, что позволяло ему сопоставлять пустые строки. (Видите эти вертикальные линии вокруг всех других слов в демонстрации? Которые я обновил, кстати) Границы слов работают так же хорошо, как и якоря, потому что допустимые слова всегда полностью состоят из букв. 21.11.2015didn't
doesn't
иdon't
дозваниваются. Это из-за апострофа? 22.11.2015?
символ перед каждой буквой в группе... однако, опять же, я мог что-то упустить. Пример:(?!.*?e)
против(?!\w*e)
22.11.2015\w
соответствует буквам, цифрам и знаку подчеркивания - как я уже сказал, это упрощение. Вы можете создать класс символов, содержащий разрешенные символы, например[A-Za-z']
или (если вы хотите разрешить не-ASCII буквы)[\p{L}']
и т. д. вместо\w
. Единственное требование, предъявляемое регулярным выражением, состоит в том, что каждое слово должно начинаться и заканчиваться реальной буквой. В противном случае привязки границ слов не будут работать правильно. 22.11.2015