Java正则表达式,匹配除文本字符串以外的任何内容';无';或';无';

Java正则表达式,匹配除文本字符串以外的任何内容';无';或';无';,java,regex,null,Java,Regex,Null,好的,伙计们。这里有一个Java面试类型的问题,似乎已经难住了这里一些非常聪明的人。他们实际上需要这个来制作代码,所以这不仅仅是一个面试难题 它们需要一个Java正则表达式,如果字符串文本不是3个字母的NIL,则该正则表达式将返回true。测试需要不区分大小写,并且正则表达式本身必须完成所有工作 因此,正则表达式应该拒绝NIL、NIL、NIL、NIL、等等 但是,它应该接受:nile、anil、will、zappa-nil-a和空字符串 编写一个简单的正则表达式需要多少Java开发人员?显然很多

好的,伙计们。这里有一个Java面试类型的问题,似乎已经难住了这里一些非常聪明的人。他们实际上需要这个来制作代码,所以这不仅仅是一个面试难题

它们需要一个Java正则表达式,如果字符串文本不是3个字母的NIL,则该正则表达式将返回true。测试需要不区分大小写,并且正则表达式本身必须完成所有工作

因此,正则表达式应该拒绝NIL、NIL、NIL、NIL、等等

但是,它应该接受:nile、anil、will、zappa-nil-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]|....+)$'
这里的想法是:

  • 长度为1、2、4或更多的所有字符串都匹配
  • 三个字符的字符串在以下情况下匹配:
  • 它不是以N或N开头;或
  • 它没有中间的I或I;或
  • 它的末尾没有L或L

  • NIL和NIL被拒绝的原因是它们不符合所有三条规则2.1、2.2和2.3。NIL确实以N开头,因此它失败于2.1。它在中间有一个I,所以它失败了2.2,它在末尾有一个L,所以它失败了2.3。

    根据这个燃烧问题的一个先导开发者,在第一个例子^(.n.$)*中的代码将被修改为:“^(i))(?!)*前面需要额外的位,因为我们无法控制编译器选项,所以正则表达式必须自己完成这项工作。接受这一点作为答案。请注意,我们在正则表达式前面添加了(?i),就在“^@ArmchairBronco
    之后。请注意,我们添加了(?i)
    是的,这就是Andrew这么说的原因。在Java中有两种方法可以做到这一点:
    (?i)
    模式。不区分大小写
    您可以将其放在“潜在开发人员”中“烟斗,让他抽一会儿,哈哈。”谢谢你的反馈,卡兹。不知道他是否吸烟,但我会确保他吸一口这种新烟草。我很欣赏这种替代方法和解释。对于斜体字部分,加1,扶手椅野马兄弟。