好,朋友们.这是一个Java面试类型的问题,似乎让一些非常聪明的人在这里难倒.他们实际上需要这个用于生产代码,因此它不仅仅是一个采访益智游戏.
他们需要一个正则表达式,在Java中,如果一个字符串文字是返回true 东西以外的3个字母的单词NIL.测试需要不区分大小写,RegEx本身必须完成所有工作.
因此,RegEx应该拒绝NIL,nil,NiL,nIL等.
但是,它应该接受:nile,anil,will,zappa-nil-a和空字符串.
编写一个简单的RegEx需要多少Java开发人员?显然很多!
And*_*ark 18
你可以使用负向前瞻来做到这一点.
启用不区分大小写的选项:
^(?!nil$).*
Run Code Online (Sandbox Code Playgroud)
你可以离开关.*
在年底,如果你不需要居然在比赛返回字符串.这是一个没有不区分大小写的选项的版本:
^(?![nN][iI][lL]$).*
Run Code Online (Sandbox Code Playgroud)
说明:
^ # 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)
Run Code Online (Sandbox Code Playgroud)
如果你想要正则表达式匹配nil\n
,那么使用\z
而不是$
在前瞻中:^(?!nil\z).*
这是一个真正的正则表达式,直接指定一个有限的自动机,可以逐个输入字符串的字符,如果字符串不是NIL的变体,它将达到接受状态:
(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)
Run Code Online (Sandbox Code Playgroud)
这将适用于不实现环视黑客攻击的经典正则表达式引擎,并且可以转换为超快的DFA.
您可能必须使用^
和锚定它$
,具体取决于您使用的正则函数类型:(整个字符串)匹配语义或子字符串搜索语义.
例如,grep测试:
# rejects lines like nIl and NiL but accepts all else
# including blank lines:
grep -E '^(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)$'
Run Code Online (Sandbox Code Playgroud)
这里的想法是:
如何拒绝NIL和Nil是因为它们都失败了所有三条规则2.1,2.2和2.3.NIL确实以N开头,因此它失败了2.1.它确实有一个I在中间,所以它失败了2.2,它最后确实有一个L,所以它失败了2.3.
归档时间: |
|
查看次数: |
9622 次 |
最近记录: |