Java正则表达式:前三位数不是666

时间:2016-10-05 09:28:29

标签: java regex jflex

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

66600abc - false

606asdfnh - true

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"));

3 个答案:

答案 0 :(得分:4)

使用否定前瞻(?!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中找到类似的模式。

答案 1 :(得分:3)

不要仅使用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!

答案 2 :(得分:1)

你可以尝试这个:

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