正则表达式
正则表达式的web开发中的常见场合
1: 邮箱验证
2:用户名验证
3:替换字符串某一部分
4:信息采集,用来分析有效的代码段
.....
.....
正则表达式 : 规则表达式
"一种有规律的字符串的描述"
正则表达式是一门独立的知识,同样的一段描述,比如,对于email的匹配表达式,
在不同语言是一样的, 但是,调用的函数可能不一样.
学习正则表达式
1: 在js里,如果写一个正则表达式, "/正则表达式/" (不含双引号)
2: 在js里,用正则表达来验证字符串是否满足, 可以用 reg.test(String); // 验证
3: js, 用正则表达式的.exec函数, 用来查找匹配的选项,并把查到的值取出. // 查找
4: 字符串应用正则,
string.match(reg), 正则查找字符串
string.search(reg), 正则查找位置
string.replace(reg,'newstr');正则替换
String.split(reg); 正则拆分
正则表达式3句话
1:要找什么字符?
2:从哪儿找?
3:找几个?
1.要找什么字符?
1.1 字面值,"hi", 就是找"hi"
1.2 字符集合来表示,[abcd], 指匹配abcd中的任意一个
1.3 用范围来表示字符 [0-9],[a-z] [A-Z]
1.4 字符"簇" (就是系统为常用的字符集合创建的一个简写)
例: \d ----> [0-9], \w--->[0-9a-zA-Z_], \s ------->[ \t\v\f\r\n](空白符)
1.5 补集的形式来表示字符集合.
例:[0-9]===>[^0-9], [abcef]===>[^abcef]
对于字符簇,只需把字母大写,即可表示补集
[\d] ==== >[\D], [\w]===>[\W],[\s]==>[\S](非空白字符)
1.6 " ", 代表"任意字符,不包括换行符"
2:从哪儿找,找到哪儿?
2.1 \b, ====>'单词边界'
\bhi ===>从单词的边界开始匹配,hi
2.2 \B ===> 单词的非边界, 把单词中间的某一部分取出来
把中间含有 hi的单词取出, 即hi不能在两端
2.3 ^ caret, 从"字符串的起始位置开始匹配",
2.4 $ ,匹配到字符串的结束位置
3: 找多少
* : 0--->N ===> 等价 {0,}
+: [1,N] ====>等价 {1,}
?: [0,1] ====>等价 {0,1}
a{n} : 字符a准确的出现n次
a{n,}: 字符a至少出现次
a{n,m}, n-->m次
个数修饰符默认是贪婪模式,尽量多找
"个数修饰符后面加?",则为非贪婪模式, 尽量少的找.
模式:
以匹配为例,默认情况,match找到一次就结束,
能否 告诉匹配过程, 一直找,在全文范围内一直找.
g ->全局模式 ,global [找所有的,而不是找一次结束]
i---> 忽略大小写 ignore
m->多行模式
s-->单行模式(把整个字符串看成一行) (js不支持单行模式)
在js里,不支持单行的情况下,如何换行?
--->什么样的模式能代表"所有"字符串
==> 用[\d\D], [\s\S],[\w\W]
预先判断是否为指定值
正向预查
C |
O |
M |
I |
N |
g |
灰色:是查找的值
预先判断是否不为指定值
负向预查
C |
O |
M |
I |
N |
g |
灰色:是查找的值
向前正向预查:
U |
n |
L |
U |
C |
ky |
Js不支持向前正向预查(零宽度正回顾后发断言)
反向引用/后向引用
子表达式
Exec为例:
匹配到的数组, 第0个单元代表 "整个正则表达式的匹配结果"
1
2
3
...
N , 则代表第 N个子表达式的匹配结果
如何引用子表达式所匹配的结果?
答:
在表达式内部,反向引用时, \n来匹配第N个子表达式的结果
子表达式的当成变量传递时,$N来匹配 第N个子表达式的匹配结果
全角空格的unicode编码 \u3000