本文的知识脑图:
一、正则表达式用来解决的问题
处理对象:字符串技术背景:要是没有正则表达式的话,表单匹配符合形式的字符串很麻烦,需要的判断分支很多,处理起来相当麻烦
技术目的:过滤不符合所定逻辑的字符串,返回匹中的字符串
案例:验证电子邮件、电话号码、身份证号等等
二、正则表达式规范形式
修饰符 | 全称 | 作用 |
---|---|---|
g | global | 是否执行全局匹配,一般都会有,没有的话,会一直从开头匹配 |
i | ignoreCase | 是否执行区分大小写匹配,写上代表不区分 |
m | multiline | 是否以多行匹配模式匹配,写上代表考虑换行,注意和 g 区分 ^123 |
三、正则表达式的方法
<html>
<head>
<script>
function test(){
var v = content.value;
//检索四个连续的数字
var myReg = /abc/gi;
while(res=myReg.exec(v)){
window.alert("找到"+res[0]);
}
}
</script>
</head>
<body>
<form OnSubmit="test()">
<textarea id="content" rows="20" cols="30">
</textarea>
<input type="submit" value="匹配">
</form>
</body>
</html>
执行结果:
<html>
<head>
<script>
function test(){
var v = content.value;
//检索四个连续的数字
var myReg = /abc/gi;
while(res=myReg.test(v)){
window.alert("找到");
}
}
</script>
</head>
<body>
<form OnSubmit="test()">
<textarea id="content" rows="20" cols="30">
</textarea>
<input type="submit" value="匹配">
</form>
</body>
</html>
(弹两次)
注意:两者区别在于后者只返回true或者false。前者比后者强大在,我能通过返回的值,确定匹配的次数以及内容是什么,进而操作内容。
四、正则表达式模式内容
元字符 | 作用 | 形式 |
---|---|---|
限定符 {n} | 用于指定前面的字符和组合项连续出现多少次 | aa{3}:匹配的是aaaa a{3,4}先按照4配实在不够再按照3配 a{2,}表示配>=2的字符,a出现一次不可以 |
限定符 + | 表示出现一次到任意多次 | /a+/gi 的效果和 /a{1,}/gi 相同 |
限定符 * | 表示出现 0 到任意多次 | /a1*/gi 能找到a,a任意多的1。规则还是按照多的来 /a*/gi的话会一直匹配中空 |
限定符 ? | 表示出现 0 到 1 次 | /a1?/gi 能匹配到a、a1 /a*/gi的话会一直匹配中空 |
字符匹配符[ ] | 匹配[ ]中给出的任意字符 | [abcd] /[a-z]/gi 匹配一个a-z中任意字符 /[^a-z]/gi匹配中不是a-z中任意一个字符 |
字符匹配符 \d \D \w \W \s \S . |
匹配0-9中任意一个数字 匹配中不是0-9中的 匹配中任意英文字母、数字下划线 匹配的和上一个相反 匹配空格制表符 匹配的和上一个相反 匹配出除了\n之外的所有字符 |
相当于[0-9] 相当于[^0-9] 相当于[a-zA-Z0-9_ ] 相当于[^a-zA-Z0-9_ ] … … … |
选择匹配符 | 或选择 | /(joncyιzhangιhello)/gi |
定位符 ^ $ |
匹配目标字符串的开始位置 匹配目标字符串的结束位置 |
/^a/ /a$/ |
需要转义的字符 | . * + $ ( ) ? { } [ ] ^ \ / |
var myReg = /abc/gi;
用反向引用:
var myReg = /(a)\1(b)\2/gi;
2. 匹配变长字符串
a. 合理使用字符匹配符来指出要匹配的字符模式;
b. 用限定符来匹配字符重复出现的长度;
c. 第一个字符前有开始标志 ,^ 匹配到的就是那里;结束字符之后也有结束标志,$匹配到的就是那里;它们的使用很重
要。
d. 要注意转义字符。
五、在字符串的方法中使用正则表达式
var s1 = "hello world!"
alert(s1.search(/world/))
结果:
var v = content.value;
var myReg = /joncy/gi;
res=v.match(myReg)
window.alert("数组:"+res);
var v = "hello java!";
var myReg = /java/gi;
res=v.replace(myReg,"joncy")
window.alert("结果:"+res);
总结一下:
1.注意这三个方法都是String的方法,调用时是字符串对象打点调用;
2.search()方法返回的是一个索引值,是匹配到第一个表达式的位置;
3.match()方法和indexof方法类似,只不过返回的不是索引值,而是值本身,从运行结果可以看出他返回的数组类型,这也是和exec()返回值不同的地方。
4.replace()的第一个参数是正则表达式,匹配中给定类型的字符串之后,用第二个参数的字符串替换。
六、正则表达式练习
/^[a-zA-Z].{3,15}/
解释:开始便是定位符,所以从字符串起始位置找。找的是起始位置之后必须是一个任意字母,这个字母在之后就是3-15个任意除\n之外的字符。因此这个表达式匹配的就是一行中必须以字母开头的4-16个字符。
思考:如果在最后加上$有什么不同?
/^[a-zA-Z0-9]{8,20}$/
解释:起始定位,结束定位,中间8-20个字母或者数字。因此匹配的就是文本必须由8-20个字母或者字符长度组成
/^[1-9]\d{5}$/
解释:邮政编码的匹配
/^[1-9]\d{4,10}$ /
解释:QQ号码的匹配
/^1[3|4|5|8]\d{9}$ /
解释:手机号码的匹配
^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$
解释:18位身份证号的匹配
/^[A-Za-z][A-Za-z1-9_-]+$/
解释:用户名的匹配,字母开头,由数字/字母/下划线
^[a-zA-Z][a-zA-Z0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$
解释:邮箱验证
注意:
1.正则表达式并不是某种语言的产物, 把它看做一种技术;
2.反向引用中的子表达式是指正则表达式内容中的(…),反向引用引用的是内容;
3.正则表达式没有技巧,多练习就好。