好,朋友们。 这里似乎已经在这里难倒了一些非常聪明的人一个Java面试型的问题。 他们确实需要这样的生产代码,因此它不仅仅是一次采访益智游戏更多。
他们需要一个正则表达式,在Java中,如果一个字符串文字是以外的任何其他的3个字母的单词NIL返回true。 该测试必须区分大小写,正则表达式本身必须做的所有工作。
所以,正则表达式应该拒绝为零,零,零,零,等等。
它应该,但是,接受:尼罗河,阿尼尔,意志,扎帕比零-a和空字符串。
如何许多Java开发人员没有考虑到写一个简单的正则表达式? 显然很多!
您可以使用一个做到这一点的负先行 。
启用不区分大小写的选项:
^(?!nil$).*
你可以离开关.*
在最后,如果你不需要居然在比赛返回字符串。 这是不区分大小写的选项版本:
^(?![nN][iI][lL]$).*
说明:
^ # start of string anchor
(?! # start negative lookahead (fail if...)
nil # literal characters 'nil'
$ # end of string
) # end lookahead
.* # consume string (not necessary, but it acts more like a typical regex)
如果你想在正则表达式匹配nil\n
,然后使用\z
代替$
在前瞻: ^(?!nil\z).*
这里是一个真正的正则表达式对于这一点,一个直接指定一个有限自动机,可以通过一个被进给的一个串中的字符,并且如果该字符串不是NIL上的变体将达到接受状态:
(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)
这将工作在经典的正则表达式引擎不落实环视黑客,并且可以转换为一个极快的DFA。
您可能必须锚定这个^
和$
,这取决于你使用什么样的正则表达式的功能:(整个字符串)匹配语义,或字符串搜索语义。
例如,grep的测试:
# rejects lines like nIl and NiL but accepts all else
# including blank lines:
grep -E '^(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)$'
这里的想法是:
- 长一个,两个或四个或更多的比赛的所有字符串。
- 一个三字符的字符串当且仅当匹配:
- 它不与N或N开始; 要么
- 它没有在中间的我或我; 要么
- 它没有一个最后的L或l。
如何NIL和无被拒绝是他们失败的所有三个规则2.1,2.2和2.3。 NIL并以N开头,所以它无法2.1。 它有在中间的我,所以失败了2.2,它也因此未能在2.3到底有升。