2013-04-15 62 views
0

我想匹配包含至少大寫和至少一個小寫字母的4到8個混合大小寫字母的字符串。我嘗試過[a-zA-z] {4,8},但它匹配了只包含小寫或大寫字母的字符串,如abba和CREEEDD。這是可以在Lex中完成的事情,還是我需要以不同的方式做到這一點?在Lex中匹配包含至少一個大寫和小寫字母的字符串,

+1

4至8 **小寫的_a串* * letters_你的意思是一串由4到8個混合的下部和上部字母組成的字符串? – Shahbaz

+0

謝謝。我修好了它。 –

回答

1

你需要零個或多個混合大小寫字母的字符串,然後是uppper小寫字母,零個或多個混合大小寫字母,小寫字母,以及零個或多個混合大小寫字母,或用更低的類似的模式大寫之前的情況。

但是,這很混亂。所以,我們可以嘗試簡化。第一個字符可能是大寫字母,所以我們需要它,接着是零個或多個混合大小寫字母,小寫字母以及零個或多個混合大小寫字母。或者第一個字符可能是小寫字母,所以我們需要它,接着是零個或多個混合大小寫字母,大寫字母以及零個或多個混合大小寫字母。

[a-z][a-zA-Z]*[A-Z][a-zA-Z]*|[A-Z][a-zA-Z]*[a-z][a-zA-Z]* 

殘留問題是限制總長度的範圍4-8字符(注意,僅有8字母字符是可悲密碼這些天;允許標點符號和數字和超過8個字符)。我會在模式識別後的動作中實現長度驗證。

或者,也可能更簡單,使用現有的規則:

[a-zA-Z]{4,8} 

,並在行動應用大小寫混合驗證:

if (islower(yytext[0]) && strpbrk(yytext, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 0) 
    ...reject... 
else if (isupper(yytext[0]) && strpbrk(yytext, "abcdefghijklmnopqrstuvwxyz") == 0) 
    ...reject... 
2

這迫切需要在正則表達式的&(和)操作,那麼下面會做的工作:

((([a-zA-Z]*([a-z][a-zA-Z]*[A-Z])|([A-Z][a-zA-Z]*[a-z]))[a-zA-Z]*)&([a-zA-Z]{4,8}) 

,但該操作不存在。當然,您可以列舉混合案例中小寫字母或大寫字母位置的所有可能性,但這將構成一個巨大的表達。

是不是經過4到8個字符的所有字符串進行過濾,以檢查不同的較低和大寫字母都存在可行嗎?也許你可以將第二個正則表達式應用於前者的結果。

附註:對於&操作沒有理論上的反對意見,因爲確定性有限自動機在交叉點下是封閉的,雖然狀態的數量可能會爆炸。這可能需要對非確定性有限自動機的通常解釋器進行重大修改。

哦,如果有人覺得挑戰是要有所作爲,那麼不要忘了補任。

+0

是否有可能創建一個匹配[a-zA-Z] {4,8}的規則,並將匹配的字符串發送到一個函數,以確定它是否具有其中的一個?我剛剛開始學習Lex,所以我不知道。 –

+1

如果你在'lex'中工作,那麼我肯定會檢查規則動作中是否出現大寫和小寫,如果沒有,那麼使用'REJECT'去下一個最佳模式。鏈接規則在'lex'(不幸)是不可能的。 –

相關問題