速学JS正则表达式

---未经作者允许,禁止转载!---

本文的知识脑图:

在这里插入图片描述

一、正则表达式用来解决的问题

处理对象:字符串
技术背景:要是没有正则表达式的话,表单匹配符合形式的字符串很麻烦,需要的判断分支很多,处理起来相当麻烦
技术目的:过滤不符合所定逻辑的字符串,返回匹中的字符串
案例:验证电子邮件、电话号码、身份证号等等

二、正则表达式规范形式

/正则表达式模式内容/ 修饰符(可选)


修饰符 全称 作用
g global 是否执行全局匹配,一般都会有,没有的话,会一直从开头匹配
i ignoreCase 是否执行区分大小写匹配,写上代表不区分
m multiline 是否以多行匹配模式匹配,写上代表考虑换行,注意和 g 区分
^123


三、正则表达式的方法

1. exec()方法
<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>

执行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. text()方法
<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$/
需要转义的字符 . * + $ ( ) ? { } [ ] ^ \ /
1.匹配固定字符串

var myReg = /abc/gi;

用反向引用:

var myReg = /(a)\1(b)\2/gi;

2. 匹配变长字符串

a. 合理使用字符匹配符来指出要匹配的字符模式;
b. 用限定符来匹配字符重复出现的长度;
c. 第一个字符前有开始标志 ,^ 匹配到的就是那里;结束字符之后也有结束标志,$匹配到的就是那里;它们的使用很重
要。
d. 要注意转义字符。



五、在字符串的方法中使用正则表达式

1. search()方法
var s1 = "hello world!"
alert(s1.search(/world/))

结果:
在这里插入图片描述

2. match()方法
var v = content.value;
var myReg = /joncy/gi;
res=v.match(myReg)
window.alert("数组:"+res);

在这里插入图片描述
在这里插入图片描述

3. replace()方法
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.正则表达式没有技巧,多练习就好。

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/85083330