Это немного сложно и немного не в моей лиге. Я хочу отсортировать список слов и исключить те, которые не содержат определенного набора символов, однако эти символы могут быть в любом порядке, и некоторые из них могут встречаться чаще, чем другие.
Я хочу, чтобы регулярное выражение искало любые слова с помощью:
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'tdoesn'tиdon'tдозваниваются. Это из-за апострофа? 22.11.2015?символ перед каждой буквой в группе... однако, опять же, я мог что-то упустить. Пример:(?!.*?e)против(?!\w*e)22.11.2015\wсоответствует буквам, цифрам и знаку подчеркивания - как я уже сказал, это упрощение. Вы можете создать класс символов, содержащий разрешенные символы, например[A-Za-z']или (если вы хотите разрешить не-ASCII буквы)[\p{L}']и т. д. вместо\w. Единственное требование, предъявляемое регулярным выражением, состоит в том, что каждое слово должно начинаться и заканчиваться реальной буквой. В противном случае привязки границ слов не будут работать правильно. 22.11.2015