正则表达式:
- 符合一定规则的表达式
- 特点:用一些特定地符号,来表示一些代码操作.如,用 a* 代表abcdse 这个字符串.
- 所以学习正则表达式,就是在学习一些特殊符号的使用
- 作用:用于专门操作字符串
- string类型提供的字符串的操作,太简单.有时候不能满足字符串操作的需求.而如果使用代码实现字符串的操作,实现的代码又会太长.这时候正则表达式就营运而生了
- 对字符串即简便又灵活高效的方式就是正则表达式
-
例子
对OO号码进行校验.
要求:QQ号只有5~15位;0不能打头;只能是数字
设计过程,从第1个字符开始设计
- 对这个QQ号的一位一位地进行分析
- 首先,第1位,不能0开头,只能取1-9 regex="[1-9]"
- 说第1位满足了,那第2位呢?只要是一个数字就可以了,所以用\\d,代表第2位
- 第3位呢,第3为也是\\d,看是不是要崩溃啊.我QQ号的位数不是定值啊,那我\\d应该写几个呢.我不知道啊!
- 所以,你知道了第3位之后都是\\d 那使用"[1-9]\\d{4,14}"
正则表达式的具体操作功能
- 进行字符串的匹配.
- 使用string
- 用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
正则表达式的介绍
字符类模式匹配
[abc] | a , b , or c (simple class) |
[^abc] | Any character except a , b , or c (negation) |
[a-zA-Z] | a through z or A through Z , inclusive (range) |
[a-d[m-p]] | a through d , or m through p : [a-dm-p] (union) |
[a-z&&[def]] | d , e , or f (intersection) |
[a-z&&[^bc]] | a through z , except for b and c : [ad-z] (subtraction) |
[a-z&&[^m-p]] | a through z , and not m through p : [a-lq-z] (subtraction) |
[abc]
- []是一个特殊的符号,表示"或"的意思. 字符串第第一个字符是a或b或c,并且匹配的字符串有且仅有1个字符,即字符串要么是 a 要么是 b 要么是 c 才能把这个字符串匹配成功
- [abc][a-z] 你的第一个字母必须是a或b或c,你的第二个字母只要是a~z就可以了.匹配的字符串的长度为2
[^abc]
- 异或a,b,c
- 第一个字母只要不是a,b,c就可以了.匹配的字符串的长度为1
- [^abc][d-f] 你的第一个字母只要不是a,且不是b,且不是c,第2个字母是d-f的字符,这个字符串就可以匹配成功.匹配的字符串的长度是2
[a-zA-Z]
- [^abc]
[a-zA-Z] 匹配的字符串的第1位即不是a,又不是b,也不是c,第2位只要字符是a~z或A~Z中的一个就可以了.匹配的字符串长度为2
[a-d[m-p]]
- 对应位置的字符或者是a-d范围的一个字符.或者是m-p范围的一个字符
[a-z&&[def]]
- 取[a-z]于[def] 的交集.则对应位置是d 或者 e 或者 f
[a-z&&[^bc]]
[a-z&&[^m-p]]
我现在要求:第1个数是1位是字母,第2位是数字
- [a-zA~Z][0-9] 这个字符串当且仅当只有2位.第1为是字符,第2为是一个数字;
- 我这个正则表达式只能校验长度为2的字符串
预定义字符类
. | Any character (may or may not match line terminators) |
\d | A digit: [0-9] |
\D | A non-digit: [^0-9] |
\h | A horizontal whitespace character: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000] |
\H | A non-horizontal whitespace character: [^\h] |
\s | A whitespace character: [ \t\n\x0B\f\r] |
\S | A non-whitespace character: [^\s] |
\v | A vertical whitespace character: [\n\x0B\f\r\x85\u2028\u2029] |
\V | A non-vertical whitespace character: [^\v] |
\w | A word character: [a-zA-Z_0-9] |
\W |
A non-word character:
[^\w]
.
\d
\D
\s
\S
\w
|
数量词
- 上面的让我一个[]代表1个字符,太麻烦了吧.于是,数字就出现了
Greedy quantifiers | |
X? | X, once or not at all |
X* | X, zero or more times |
X+ | X, one or more times |
X{n} | X, exactly n times |
X{n,} | X, at least n times |
X{n,m} | X, at least n but not more than m times |
X
?
- X代表一个匹配规则
- 这个?就代表,这个规则X,出现了1次或者1次也没有
- [a-zA-Z]\\d?
- 我的第1个字符是一个字母,第2个字符是一个数字,在\\d 后面添加了一个"?" ,表示我的\\d有可能有,有可能没有.即我的字符串中第2位以后可能有一个数字,也有可能没有
- 如 "a7","a" 都可以匹配成功
X
*
- *后面的所有的匹配规则都是X,一旦出现别的类型的匹配规则,就会出现错误.
- 代表这个匹配规则X可能出现0次或者多次(1,2,3,4...n)
- 0次是啥意思啊 . * 就是X*的0次的意思
- "[a-z]\\d*"
- 字符串 "a" 匹配成功
- X,号后边的匹配规则必须是和X这个规则同一个类型的.
- 例如 [a-z]\\d* 表示字符串的第1位是字母a-z,第2位是数字,第3位及其以后都必须是数字才可以
- "a2a4" 这个字符串就匹配失败了 .因为第3位是一个字母
- 例如 [a-z]\\d* 表示字符串的第1位是字母a-z,第2位是数字,第3位及其以后都必须是数字才可以
- 但是你要记住啊出现多次X的规则,必须是连续出现的.XXXXX
X
+
- +后面必须得有不少于1个X匹配规则
- +后面的所有的规则都是X
- 如"a+"
- "aab" 匹配失败 .因为第1个字符a后面,不是所有的字符都是a,第3位是b
- "aaa" 匹配成功
X
{
n
}
- X规则出现n次
- [a-z]\\d{3}
- "a111" 匹配成功
- "a1111" 匹配不成功
- [a-z]\\d{3}[a-z]
- 匹配的字符串长度为1+3+1=5
- "a111a" 匹配成功
X{n,}
- 至少取n次
- [a-z]\\d{3,}
- "a11" 匹配不成功
- "a111" 匹配成功
- "a1111" 匹配成功
- "a1113" 匹配成功.因为"[a-z]\\d{3,}" 要求的字符串的长度就是4,当a111 匹配成功折之后,匹配结果true 就会被返回."a11113"中的3的匹配将不会被执行.程序的运行就会停止
X{n,m} |
构建正则表达式的一个非常好的方法
int num=3
String str ="[a-zA-Z]"+"{"+num+"}" //
[a-zA-Z]{3}
手机号段匹配
13xxx 15xxx 18xxx
regix="1{358}\\d{9}"