正则表达式中的字母abcd至少一次

时间:2011-03-28 08:43:38

标签: regex lex

如何编写一个正则表达式,它将至少返回包含一系列字母(如abcd)的所有单词(除了所需的子序列之外还可能包含其他字母)?

abcd必须是单词的后续部分。

谢谢!

P.S。用于lex

%{
%}

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

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

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

3 个答案:

答案 0 :(得分:4)

使用前瞻来检查单词中所有字母是否存在的简单模式:

\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 and Lookbehind Zero-Width Assertions

答案 1 :(得分:0)

\b\w*abcd\w*\b

此正则表达式匹配包含abcd字符序列的所有单词..

答案 2 :(得分:0)

如果abcd必须按此顺序出现,则采用以下模式 将匹配:

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

如果没有这样的订单限制,当 Kobi 回答时,前瞻将是 需要。 虽然flex有 trailing context,有limitations, 并且不会满足复杂的前瞻目的。