2014-09-27 156 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(自由间距)修改器,否则您需要删除该替换之间的空格。