2011-03-28 27 views
1

如何編寫一個正則表達式,該正則表達式將返回包含每個字母序列(如abcd)的所有單詞至少一次(也可能包含除必需子序列以外的其他字母)?帶範圍內字母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 */ } 
%% 
+0

示例匹配/不匹配輸入會很好。 – BoltClock 2011-03-28 08:44:45

+1

必須'abcd'是該字的子字符串,子序列還是子集? – 2011-03-28 08:57:59

+1

你可以編輯這個問題嗎?我已經添加了一個答案,假設這組字母是靜態的。如果你事先不知道,你最好寫代碼。 – Kobi 2011-03-28 09:15:29

回答

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

參見:​​

+0

這不是說必須在bcd之前出現嗎? 乾杯! – 2011-03-28 09:15:35

+0

@Nathanie - 不,它不!這將是'\ w * a \ w * b \ w * c \ w * d \ w *'。我已經添加了一個解釋,並檢查示例鏈接。 – Kobi 2011-03-28 09:21:13

+0

Got'cha!謝謝!雖然不知道,如果lex支持,因爲它似乎產生無法識別的規則錯誤... – 2011-03-28 09:25:57

0
\b\w*abcd\w*\b 

此正則表達式匹配包含abcd字符序列..

+0

對不起,應該說,它需要是這個詞的後續部分。 – 2011-03-28 09:10:30

0

如果abcd必須按以下順序出現,下面的模式 將匹配:

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

如果沒有這樣的順序約束,因爲Kobi answere d,預見將需要 。 儘管flex有 trailing context,但有limitations, 並且不會達到複雜的預見目的。

相關問題