Java的正则表达式匹配任何东西,但文字串“NIL”或“零”(Java RegEx that mat

2019-07-29 02:41发布

好,朋友们。 这里似乎已经在这里难倒了一些非常聪明的人一个Java面试型的问题。 他们确实需要这样的生产代码,因此它不仅仅是一次采访益智游戏更多。

他们需要一个正则表达式,在Java中,如果一个字符串文字是以外的任何其他的3个字母的单词NIL返回true。 该测试必须区分大小写,正则表达式本身必须做的所有工作。

所以,正则表达式应该拒绝为零,零,零,零,等等。

它应该,但是,接受:尼罗河,阿尼尔,意志,扎帕比零-a和空字符串。

如何许多Java开发人员没有考虑到写一个简单的正则表达式? 显然很多!

Answer 1:

您可以使用一个做到这一点的负先行 。

启用不区分大小写的选项:

^(?!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).*



Answer 2:

这里是一个真正的正则表达式对于这一点,一个直接指定一个有限自动机,可以通过一个被进给的一个串中的字符,并且如果该字符串不是NIL上的变体将达到接受状态:

 (|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)

这将工作在经典的正则表达式引擎不落实环视黑客,并且可以转换为一个极快的DFA。

您可能必须锚定这个^$ ,这取决于你使用什么样的正则表达式的功能:(整个字符串)匹配语义,或字符串搜索语义。

例如,grep的测试:

 # rejects lines like nIl and NiL but accepts all else
 # including blank lines:

 grep -E '^(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)$'

这里的想法是:

  1. 长一个,两个或四个或更多的比赛的所有字符串。
  2. 一个三字符的字符串当且仅当匹配:
    1. 它不与N或N开始; 要么
    2. 它没有在中间的我或我; 要么
    3. 它没有一个最后的L或l。

如何NIL和无被拒绝是他们失败的所有三个规则2.1,2.2和2.3。 NIL并以N开头,所以它无法2.1。 它有在中间的我,所以失败了2.2,它也因此未能在2.3到底有升。



文章来源: Java RegEx that matches anything BUT literal string 'NIL' or 'nil'
标签: java regex null