正则表达式处理零

我有*(星号)符号作为输入的字符串。 如果字符串有两个连续的星号,则认为该字符串无效。 但是,有一个逃逸符号(反斜杠)。

例如:

  • “**”(无效)
  • “ **”(有效)
  • “case **”(无效)
  • “case **”(有效)
  • “* *”(有效)
  • 我一直在坚持这样的正则表达式产生不正确的结果:

  • /[^]**/ - java.util.regex.Pattern.compile("/[^\]**/")
  • /([^]*?**)|(**)/ - java.util.regex.Pattern.compile("/([^\]*?**)|(**)/")
  • 此外,我从这里阅读了关于贪婪,不情愿和占有量的量化http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

    我知道这个问题是关于零长度匹配,但不能产生正确的正则表达式。


    你正在寻找一个正则表达式,只会匹配无效的字符串? 这应该做到:

    "(?<!\)**+"
    

    它将连续匹配两个或多个星号,而不是前面加一个反斜杠。

    编辑: (?<!foo) thingy被称为“负面后顾”。 它匹配字符串中的任何零长度位置,该位置不是紧接在括号内匹配正则表达式的区域(本例中为“foo”,或者是您的反斜杠)。 起初,我把它当作[^\] ,除了它匹配任何字符(除了反斜杠外),而不是一个字符的缺少,就像在开始时一样“**”中的一个字符串。

    对lookarounds(look-behind和look-ahead)以及许多其他正则表达式“magic”有很好的详细描述


    使用string.matches方法。 这对有效的字符串返回true。

    String s1 = "case**";
    String s2 = "case**";
    System.out.println(s1.matches("(?=.*(\**|*\*)).*"));
    System.out.println(s2.matches("(?=.*(\**|*\*)).*"));
    

    输出:

    false
    true
    

    DEMO

    链接地址: http://www.djcxy.com/p/76969.html

    上一篇: Regex handling zero

    下一篇: Use of reluctant quantifier in regex