首页 > Java > 正文

JAVA中校验密码的正则表达式

2018-07-22 Java 3702 ℃ 0 评论

正则表达式是一种描述字符串集合的方法,它是以字符串集中各字符串的共有特征为依据的。正则表达式可以用于探索、编辑或者操作文本和数据。它超出了java程序设计语言的标准语法,因此有必要去学习特定的语法来构建正则表达式。正则表达式的变化是复杂的,一旦你理解了他们是如何被构造的话,你就能解析或者构建任意的正则表达式了。

在JDK1.3以及之前的JDK版本中并没有包含正则表达式的类,如果要在JAVA中使用正则表达式则必须使用第三方提供的正则表达式库。而在JDK1.4开始提供了支持正则表达式API,他们位于java.util.regex包中,由于已经有了标准API,所以本书将会用java.util.regex进行正则表达式的相关操作。

java.util.regex包主要由三个类组成:Pattern、Matcher和PatternSyntaxException。Pattern对象表示一个已经编译的正则表达式,Pattern类没有提供公共的构造方法,要构建一个模式,首先必须调用公共的静态complie方法,它将返回一个Pattern对象,这个方法接受正则表达式作为第一个参数。Matcher是一个靠着输入的字符串来解析这个模式和完成匹配操作的对象,与Pattern相似,Matcher也没有定义公共的构造方法,需要通过调用Pattern对象的matcher方法来获得一个Matcher对象。PatternSyntaxException对象是一个未检查异常,指示了正则表达式中的一个错误语法。

1、常见的正则表达式中元字符的含义:


元字符
说明
       .匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”。
      $匹配行结束符。例如正则表达式“EJB$能够匹配字符串“I like EJB”的末尾,但是不能匹配字符串“J2EE Without EJBs!”。 
      ^匹配一行的开始。例如正则表达式“^Spring”能够匹配字符串“Spring is a J2EE framework”的开始,但是不能匹配
I use Spring in my project”。
      *匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配z以及zoo”;正则表达式“.*”意味着能够匹配任意字符串。
      /转义符,用来将元字符当作普通的字符来进行匹配。例如正则表达式/$被用来匹配美元符号,而不是行尾;
正则表达式
/.用来匹配点字符,而不是任何字符的通配符。
      []匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bugbigbug,但是不匹配beg。可以在括号中使用连字符“-”来
指定字符的区间来简化表示,例如正则表达式
[0-9]可以匹配任何数字字符,这样正则表达式“a[]c”就可以匹配“a0c”、“a1c”、
a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母。还有一个相配合使用的元字符“^”,用在这
里并不像前边的那个“
^”一样表示匹配行开始,而是表示排除,要想匹配除了指定区间之外的字符,就可以在左边的括号
和第一个字符之间使用
^字符,例如“[^163A-Z]”将能偶匹配除了163和所有大写字母之外的任何字符。
      () () 之间括起来的表达式定义为”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串
提取的时候非常有用。
      |将两个匹配条件进行逻辑运算。'z|food' 能匹配 "z"  "food"'(z|f)ood' 则匹配"zood"  "food"
     +匹配前面的子表达式一次或多次。例如正则表达式9+匹配999999等。
     ?匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do"  "does" 中的"do" 。此元字符还有另外一个用途,
就是表示非贪婪模式匹配,后边将有介绍
    {n}匹配确定的 n 次。例如,“e{2}不能匹配“bed”中的“d”,但是能匹配“seed”中的两个“e”。
    {n,}至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配seeeeeeeed”中的所有“e”。
   {n,m}最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
   其他
/t:制表符,等同于/u0009
/n:换行符,等同于/u000A
/d:代表一个数字,等同于[0-9]
/D:代表非数字,等同于[^0-9]
/s:代表换行符、Tab制表符等空白字符
/S:代表非空白字符
/w:字母字符,等同于[a-zA-Z_0-9]
/W:非字母字符,等同于[^/w]
例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“/d”。
[abc] a, b 或 c(简单类)
[^abc] 除 a, b 或 c 之外的任意字符(取反)
[a-zA-Z] a 到 z,或 A 到 Z,包括(范围)
[a-d[m-p]] a 到 d,或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d,e 或 f(交集)
[a-z&&[^bc]] 除 b 和 c 之外的 a 到 z 字符:[ad-z](差集)
[a-z&&[^m-p]] a 到 z,并且不包括 m 到 p:[a-lq-z](差集)


2、正则表达式校验密码实战

密码校验规则如下:

1.必须包含数字、字母、特殊字符三种    

2.长度至少8位

3.不能包含3位及以上相同字符的重复(hhh123@jixxx)

4.不能包含3位及以上字符组合的重复(123q123c123)

5.不能包含3位以上的正序及逆序连续字符(123#wete#321)

6.不能包含空格、制表符、换页符等空白字符

7.支持特殊字符范围:^$./,;:'!@#%&*|?+(){}[]


按照需求进行正则表达式拆解

规则1&&8

str.matches("^.*[a-zA-Z]+.*$") && str.matches("^.*[0-9]+.*$")
&& str.matches("^.*[/^/$/.//,;:'!@#%&/*/|/?/+/(/)/[/]/{/}]+.*$")

规则2

str.matches("^.{8,}$")

规则3

!str.matches("^.*(.)\\1{2,}+.*$")

规则4

!str.matches("^.*(.{3})(.*)\\1+.*$")

规则5&&7

javaImpl:
first change str to char[]
then  for  Math.abs(cc[0] - cc[1]) == 1 && (cc[0] - cc[1]) == (cc[1] - cc[2])
如果想去掉特殊字符的连续:
first str.split("[^\\w]+")  as str1[]
then for  str1[]
then for  str1[i]     javaImpl:

规则6

!str.matches("^.*[\\s]+.*$")

转自https://blog.csdn.net/xiaxiaoxiong12345/article/details/52648462

猜你喜欢

日历
«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
标签列表
最近发表
友情链接