【问题标题】:Java regex: First three digits are not 666Java 正则表达式:前三位数字不是 666
【发布时间】:2016-10-05 09:28:28
【问题描述】:

如果前三位不是 666,我需要创建一个返回 true 的正则表达式。以下是一些示例:

66600abc - 错误

606asdfnh - 真

600asdfasdf -true

我已经尝试过了,但我没有得到想要的结果。

System.out.println(Pattern.matches("[(^[(6)(6)(6)])][a-zA-Z0-9]*", "6660"));
System.out.println(Pattern.matches("[^6]{3}[a-zA-Z0-9]*", "606"));
System.out.println(Pattern.matches("[^666]{3}[a-zA-Z0-9]*", "506"));
System.out.println(Pattern.matches("[^666][a-zA-Z0-9]*", "636"));
System.out.println(Pattern.matches("[^666][a-zA-Z0-9]*", "666"));

【问题讨论】:

标签: java regex jflex


【解决方案1】:

使用负前瞻 (?!666) 并匹配字母数字符号,您可以使用 \p{Alnum}

System.out.println("6660".matches("(?!666)\\p{Alnum}*"));

注意matches()默认锚定模式,不需要^$

一些online tests:

System.out.println("6660".matches("(?!666)\\p{Alnum}*"));        // false
System.out.println("66600abc".matches("(?!666)\\p{Alnum}*"));    // false
System.out.println("606asdfnh".matches("(?!666)\\p{Alnum}*"));   // true
System.out.println("600asdfasdf".matches("(?!666)\\p{Alnum}*")); // true

更新

因为那是 JFlex,你可以使用这个正则表达式如果最小字符数是 3并且只允许使用字母数字符号

"^([a-zA-Z0-9]{1,2}$|[a-zA-Z0-57-9][a-zA-Z0-9]{2}|[a-zA-Z0-9][a-zA-Z0-57-9][a-zA-Z0-9]|[a-zA-Z0-9]{2}[a-zA-Z0-57-9])[a-zA-Z0-9]*"

如果您需要允许任何字符,而不仅仅是字母数字,您可以使用将[a-zA-Z0-9] 替换为. 并将[a-zA-Z0-57-9] 替换为[^6]

"^(.{1,2}$|[^6].{2}|.[^6].|.{2}[^6]).*"

regex demo

请注意,您可能会在我的 previous Regex: match everything but SO answer 中找到类似的模式。

【讨论】:

【解决方案2】:

不要仅仅使用 Pattern.matches 来检查魔法值。

如果您希望字符串不以“666”开头,只需检查 String.startWith(String):

class Test {
   public static Boolean isNotEvil(String str) {
     return !myString.startWith("666");
   }

  public static void main(String [] args)
  {
     System.out.println(Test.isNotEvil("azerty") ? "Not evil" : "Evil!" );
     System.out.println(Test.isNotEvil("66600abc") ? "Not evil" : "Evil!" );
     System.out.println(Test.isNotEvil("606asdfnh") ? "Not evil" : "Evil!" );
     System.out.println(Test.isNotEvil("600asdfasdf") ? "Not evil" : "Evil!" );
     System.out.println(Test.isNotEvil("666") ? "Not evil" : "Evil!" );
  }
}

结果:

 Not evil
 Evil!
 Not evil
 Not evil
 Evil!

【讨论】:

  • 我需要 JFlex 解析器的正则表达式。
  • 为什么要添加双重否定?首先是“IsNotEvil()”,然后返回 !myString.startsWith...
【解决方案3】:

你可以试试这个:

([^6]|.[^6]|..[^6]).* 

【讨论】:

  • 而是“^((6|66)$|([^6]|.[^6]|..[^6]).*)”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多