2014-09-27 155 views
0

我想學習處理正則表達式,並得到了一些練習,但沒有解決方案。一個問題是:除「if」之外的所有小寫字母。正則表達式

我能做到這一個是這樣的:

[a-z][a-z]^[if] | [a-z][a-z][a-z]+ 

我想到一個詞至少有兩個字符。所以每個三個或更多的單詞都可以。

+0

發佈一些例子..你想匹配'fooifbar'嗎? – 2014-09-27 12:44:47

+0

如果您正在嘗試,請嘗試[regetron](https://gitorious.org/regetron) – DOOM 2014-09-27 12:50:39

+0

「至少有兩個」還應包含兩個。注意'|'周圍的空格,這些都包含在模式匹配中。 www.regex101.com是一個很好的實驗網站。 – BUSY 2014-09-27 12:51:06

回答

1

嗯......全真正的解決方案是類似的東西:

\b(?!if\b)\p{Ll}+\b 

Demo

不過,我想它的,那麼,「更高級別」的正則表達式,你沒有學然而。

所以,讓我們保持簡單。如果你能接受忽略少於3個字符的話,你可以這樣寫:

\b[a-hj-z][a-eg-z][a-z]+|i[a-z]{2,} 

Demo

前兩個字符類只是[a-z]沒有if分別。

如果你想包括少於3個字符的話,這將做到:

\b(?:i|if[a-z]+|i[a-eg-z][a-z]*|[a-hj-z][a-z]*)\b 

Demo

但它能夠在這一點複雜...

+0

感謝您的解釋 – user1550036 2014-09-27 12:56:42

+0

您的第一個正則表達式會匹配單個字符。 – 2014-09-27 12:58:35

+0

@AvinashRaj是的,這是關鍵,我試圖放寬3+信的要求。畢竟「a」仍然是一個詞。 – 2014-09-27 13:02:55

1

兩個序列的所有或更多小寫字母,「if」除外:

[a-hj-z][a-z]+|i(?:[a-eg-z][a-z]*|f[a-z]+) 

隨着負前瞻,你也可以這樣做:

(?!if\b)[a-z]{2,} 
1

一個簡單的解決辦法是把要忽略的交替操作的左側,放置希望在捕獲匹配什麼什麼按照您嘗試的方式在變更操作員的右側分組。

\bif\b|([a-z]{2,}) 

注:插入符號^一個字符類以外,並不意味着否定,它斷言的位置在字符串的開始。除非您使用x(自由間距)修改器,否則您需要刪除該替換之間的空格。