一.简介
1.什么是正则表达式
正则表达式是一个强大的字符串处理工具,可对字符串进行查找,提取,分割,替换等操作。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
2.用途
1. 验证邮箱
2.识别手机号银行卡号
3 .互联网网络爬虫
……
二.语法
1.基本字符
字符
解释
x
字符x(x可代表任何合法字符)
$
匹配输入字符串结尾的位置
^
匹配输入字符串开始的位置。
()
标记子表达式的开始和结束位置
*
零次或多次匹配前面的字符或子表达式。
+
一次或多次匹配前面的字符或子表达式。
?
零次或一次匹配前面的字符或子表达式。
.
匹配除"\r\n"之外的任何单个字符。
\d
匹配一个数字字符。等价于[0-9]。
\D
匹配一个非数字字符。
\s
匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S
匹配任何可见字符。等价于[^ \f\n\r\t\v]。
\w
匹配包括下划线的任何单词字符。
\W
匹配任何非单词字符。等价于“[^A-Za-z0-9_ ]”。
\num
匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)
\B
匹配非单词边界。
\A
输入的开头
\G
前一个匹配的结尾
2.三种模式
Greedy(贪婪模式):最大匹配
尽可能多的匹配字符。 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的。
Reluctant(懒惰模式):最小匹配
它只会匹配最少的字符。在 Reluctant 的模式下,只要匹配成功,就不再继续尝试匹配更大范围的内容
Possessive(占有模式):完全匹配
Possessive 模式与 Greediness 有一定的相似性,那就是都尽量匹配最大范围的内容,直到内容结束,但与 Greediness 不同的是,完全匹配不再回退尝试匹配更小的范围。
贪婪模式与侵占模式的比较
正则:\w+[a-z]与\w++[a-z] 目标串:232hjdhfd7474$ 分析:①\w+[a-z]:\w+属于贪婪模式,会一次性吃掉它所能吃掉的所有的字符,也就是子串232hjdhfd7474,此时[a-z]不能够找到匹配了,故\w+匹配的串会吐出一个字符4,但此时还是得不到匹配。反复的这样吐出回退,直到吐出字符d时,此时[a-z]能够匹配h,所以这时正则表达式会返回一次成功的匹配结果,为232hjdhfd ②\w++[a-z]:\w++属于侵占模式,它会一次性吃掉它所能够吃掉的所有字符,即子串232hjdhfd7474,而且不留给其他部分使用,故不会回退。此时[a-z]不能够找到匹配,所以此次匹配失败。在余下的子串中也找不到能匹配成功的子串。所以整个正则表达式是找不到匹配结果的!
贪婪模式
懒惰模式
占有模式
说明
X?
X??
X?+
X出现0次或一次
X*
X*?
X*+
X出现零次或多次
X+
X+?
X++
X出现一次或多次
X{n}
X{n}?
X{n}+
X出现n次
X{n,}
X{n,}?
X{n,}+
X最少出现n次
X{n,m}
X{n,m}?
X{n,m}+
X最少出现n次最多出现m次
3.捕获分组
概念:其实就是一个括号内的内容。 如 “(\d)\d” 而"(\d)" 这就是一个捕获分组,可以对捕获分组进行 后向引用 (如果后而有相同的内容则可以直接引用前面定义的捕获组,以简化表达式) 如(\d)\d\1 这里的"\1"就是对"(\d)"的后向引用
如 “zery zery” 正则 \b(\w+)\b\s\1\b 所以这里的"\1"所捕获到的字符也是 与(\w+)一样的"zery",为了让组名更有意义,组名是可以自定义名字的
“\b(?\w+)\b\s\k\b” 用"?"就可以自定义组名了而要后向引用组时要记得写成 “\k”;自定义组名后,捕获组中匹配到的值就会保存在定义的组名里。
三.简单使用
java提供Pattern,Matcher两个类用于提供正则表达式的支持简单使用如下
String str2 = "To be or not to be,this is a question" ;
Matcher m1 = Pattern. compile ( "\\w+" ) . matcher ( str2) ;
while ( m1. find ( ) ) {
System. out. println ( m1. group ( ) + "起始位置" + m1. start ( ) + "结束位置" + m1. end ( ) ) ;
}
Matcher m2 = Pattern. compile ( "(t|b)\\w*" ) . matcher ( str2) ;
while ( m2. find ( ) ) {
System. out. println ( m2. replaceAll ( "girl" ) ) ;
}
String类的matches(),replaceAll(),replaceFirst(),split(),都依赖正则表达式支持
String str = "To be or not to be,this is a question" ;
String s = "b\\w*" ;
boolean b1 = str. matches ( s) ;
String str1 = str. replaceAll ( s, "haha" ) ;
String s1 = " " ;
String[ ] arr = str. split ( s1) ;