正则表达式是一种描述字符串集合的方法,它是以字符串集中各字符串的共有特征为依据的。正则表达式可以用于探索、编辑或者操作文本和数据。它超出了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”匹配bug、big和bug,但是不匹配beg。可以在括号中使用连字符“-”来 指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[]c”就可以匹配“a0c”、“a1c”、 “a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母。还有一个相配合使用的元字符“^”,用在这 里并不像前边的那个“^”一样表示匹配行开始,而是表示“排除”,要想匹配除了指定区间之外的字符,就可以在左边的括号 和第一个字符之间使用^字符,例如“[^163A-Z]”将能偶匹配除了1、6、3和所有大写字母之外的任何字符。 |
() | 将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串 提取的时候非常有用。 |
| | 将两个匹配条件进行逻辑“或”运算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配"zood" 或 "food"。 |
+ | 匹配前面的子表达式一次或多次。例如正则表达式9+匹配9、99、999等。 |
? | 匹配前面的子表达式零次或一次。例如,"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.支持特殊字符范围:^$./,;:'!@#%&*|?+(){}[]
按照需求进行正则表达式拆解
str.matches("^.*[a-zA-Z]+.*$") && str.matches("^.*[0-9]+.*$") && str.matches("^.*[/^/$/.//,;:'!@#%&/*/|/?/+/(/)/[/]/{/}]+.*$")
str.matches("^.{8,}$")
!str.matches("^.*(.)\\1{2,}+.*$")
!str.matches("^.*(.{3})(.*)\\1+.*$")
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:
!str.matches("^.*[\\s]+.*$")
转自https://blog.csdn.net/xiaxiaoxiong12345/article/details/52648462