Регулярное выражение с буквой в диапазоне abcd хотя бы один раз - PullRequest
1 голос
/ 28 марта 2011

Как бы вы написали регулярное выражение, которое будет возвращать все слова, которые содержат каждую последовательность букв (например, abcd), по крайней мере, один раз (может также содержать другие буквы помимо необходимой подпоследовательности)?должна быть подпоследовательностью слова.

Спасибо!

Ps за использование с lex

%{
%}

delim           [ \t\n]
ws              {delim}+
lc              [a-z]

%%
{ws}            {/* no action taken */}

(?={lc}*a)(?={lc}*b)(?={lc}*c)(?={lc}*d)            { /* some code */ }
%%

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Простой шаблон для проверки наличия всех букв в слове с использованием lookaheads:

\b(?=\w*a)(?=\w*b)(?=\w*c)(?=\w*d)\w+\b

Вы можете захотеть ^...$ вместо \b...\b, если хотите проверить слово, а не захватывает его, и вы можете захотеть изменить \w на свой приемлемый алфавит.

Каждый токен (?=\w*a) является заглядыванием - он проверяет наличие букв иa впереди, но не продвигается - следующее условие, b, снова проверяется с самого начала.Последний \w+ - это то, что на самом деле фиксирует слово, после того как мы проверили все ли буквы.

Рабочий пример: http://rubular.com/r/L00DTpE813

См. Также: Lookahead и Lookbehind Zero-Ширина утверждений

0 голосов
/ 29 марта 2011

Если a, b, c и d должны появиться в этом порядке, будет соответствовать следующий шаблон:

{lc}*a{lc}*b{lc}*c{lc}*d{lc}*   { /* some code */ }

Если такого порядка нет,Как ответил Коби , потребуется предварительный просмотр.Хотя flex имеет конечный контекст , есть ограничения , и он не будет соответствовать сложным прогнозным целям.

0 голосов
/ 28 марта 2011
\b\w*abcd\w*\b

Это регулярное выражение соответствует всем словам, содержащим abcd последовательность символов ..

...