正则表达式概述
正则概述
1、正则解析
正则表达式与Xpath是类似的,都是一门独立的语言,可以运行于大多数的编程语言中。
Xpath:jquery,php,java
正则表达式:javascript,php,java
2、正则起源
1956年,由两位神经生理方面的科学家创造性通过一种数学符号的形式来描述神经元系统,后来又被肯·汤普逊(Unix系统之父)把这种数学符号引入到计算机的搜索算法中,并逐渐引入到计算机系统中…后来这种符号成为一门独立的语言广泛的用于计算机系统中。
3、什么是正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
精准匹配:$sql = "select * from sh_goods where title='N85'";
模糊匹配:$sql = "select * from sh_goods where title like '%N85%'";
4、正则表达式应用场景
1)数据隐藏 刘先生 135****6789中奖了
2)数据过滤 和谐了,河蟹了,牛逼,牛x
3)数据验证 手机号码验证、邮箱验证、IP验证
4)数据采集 采集网站数据、采集手机号码、采集邮箱…
5)数据检索 高亮显示
5、快速入门
① 查找一个字符串中是否具有数字"8"
② 查找一个字符串中是否具有数字
③ 查找一个字符串中是否具有非数字
二、正则对象
1、为什么需要正则对象
记住:在使用正则表达式时有一个前提,必须要创建一个正则对象。
2、正则对象的定义
在javascript中,定义正则对象一共有两种定义方式:
1)隐式创建正则对象
var 正则对象 = /正则表达式/匹配模式;
示例代码:
问题:正则对象既然也是一个对象,那其是哪个类的实例呢?
答:通过以上代码测试可知,正则对象是系统内置类RegExp类的实例
2)直接实例化(显示创建)
基本语法:
var 正则对象 = new RegExp('正则表达式','匹配模式');
特别说明:在功能上,隐式创建正则对象与直接实例化创建正则对象效果是完全一致的。都是为了得到RegExp类的实例,两者的主要区别在于语法的不同:
var reg = /\d\d\d/gi;
var reg = new RegExp('\\d\\d\\d','gi');
3、匹配模式
g:global缩写,全局匹配,从左向右全部匹配
i:ignore缩写,忽略大小写
4、正则常用的6大方法
1)RegExp类下的两个方法:
test(str) :判断字符串中是否包含指定模式的子串,返回布尔类型
exec(str) :返回指定模式的字符串
2)String类下的四个方法:
search(reg) :返回指定模式的子串在字符串中出现的位置,默认从0开始
match(reg) :以数组形式返回指定模式的字符串
replace(reg,替换后的字符串) :返回替换指定模式后的字符串
split(reg) :以数组形式返回指定模式分割后字符串
示例代码:
三、几个常用的概念
1、子表达式
在正则表达式中,通过一对圆括号括起来的内容,我们就称之为"子表达式"
例:var reg = /\d(\d)\d/gi;
2、捕获
当子表达式匹配到相应的内容后,系统会自动捕获到这个过程,并把子表达式匹配的内容放入到系统的相应的缓存区中,我们把这个过程就称之为"捕获"。
3、反向引用
在正则表达式中,可以通过\n来引用n号缓冲区的内容,我们把这个过程就称之为"反向引用"。
4、思考题
1)查找连续的四个数字,如:3569
答:var reg = /\d\d\d\d/gi;
2)查找连续的相同的四个数字,如:1111
答:var reg = /(\d)\1\1\1/gi;
3)查找数字,如:1221,3443
答:var reg = /(\d)(\d)\2\1/gi;
4)查找大写字符,如:AABB,TTMM
在正则表达式中可以通过字符簇[A-Z]来表示A-Z中的任一字符
答:var reg = /([A-Z])\1([A-Z])\2/g;
5)查找连续相同的四个数字或四个字符
在正则表达式中可以通过\w来表示任一单词字符0-9/a-z/A-Z/_
答:var reg = /(\w)\1\1\1/gi;
6)练习题:使用正则表达式,匹配出字符串中的html标签
var str = ab<h1>hello</h1>cdefghij<div>world</div>;
四、exec方法与子表达式
1、exec方法的使用
例1:使用exec返回指定模式的字符串
由上图程序运行结果可知,exec方法默认只能返回一个结果,如果想满足所有结果必须使用while方法对其进行遍历输出。
2、exec方法的遍历输出
例2:while+exec实现对数据的输出
运行结果:
3、exec方法与子表达式
运行结果:
由以上运行结果可知,如果我们在正则表达式中使用了子表达式,其结合exec方法输出时,其输出会自动包含子表达式所匹配的内容。
如上图:
第一次运行时,系统会将最终的匹配结果放入索引为0的数组元素中
系统会将第一个子表达式匹配到的内容放入到索引为1的数组元素中
第二次运行时,依次类推,所以得到以上结果…
如果我们在实际项目开发中遇到了以上问题,可以直接输出索引为0的数据即可。
只有exec方法是这样的,使用match 不会有这种情况
五、正则表达式
1、编写正则三步走
第一步:确定查什么
第二步:限定查多少
第三步:从哪查
2、正则表达式的组成部分
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符:abc,123,@#$
元字符:\d \D \w
3、查什么(匹配符)
1)字符簇
在正则表达式中,通过一对[]方括号括起来的内容,我们称之为"字符簇",其代表的是一个范围,但是其只能匹配固定的某个字符。
[a-z] :匹配小写字母a-z中的任一字符
[A-Z] :匹配大写字母A-Z中的任一字符
[0-9] :匹配数字0-9之间的任一数字字符
[0-9a-z] :匹配0-9或a-z之间的任一字符
[0-9a-zA-Z] :匹配0-9或a-z或A-Z之间的任一字符
[abcd] :匹配字符a或字符b或字符c或字符d中的任一字符
[1234] :匹配数字1234之间的任一字符
2)脱字节
在字符簇中存在一个特殊的符号^,其代表取反的含义
[^a-z] :匹配除小写字符a-z以外的其他字符
[^0-9] :匹配除数字0-9以外的其他字符
[^abcd] :匹配除字符abcd以外的其他字符
3)特殊的匹配符
\d :匹配一个数字字符,用字符簇表示为[0-9]
\D :匹配一个非数字字符,使用脱字节[^0-9]或[^\d]
\w :匹配包括下划线的任何单词字符,[0-9a-zA-Z_]
\W :匹配任何非单词字符,[^\w]
\s :匹配任何空白字符,空格、换行、制表符
\S :匹配任何非空白字符,[^\s]
.(我是一个点号) :匹配除 "\n" 之外的任何单个字符
示例代码:
4、查多少(限定符)
限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
* 匹配前面的子表达式零次或多次 0或多 {0,}
+ 匹配前面的子表达式一次或多次 1或多 {1,}
? 匹配前面的子表达式零次或一次 0或1 {0,1}
{n} 匹配确定的 n 次 \d{3} :3位连续的数字字符
{n,} 至少匹配n 次 n到多
{n,m} 最少匹配 n 次且最多匹配 m 次
示例代码:
运行以上代码发现一个很有意思的规则:
【贪婪匹配原则】
对于我们的限定符,正则表达式会优先匹配多的情况,而不会匹配少的情况,我们把这种特性就称之为"贪婪匹配原则"。
【非贪婪匹配原则】
我们可以在限定符的后面,添加一个问号?,就可以强制把贪婪匹配原则更改为非贪婪匹配原则。
5、从哪查(定位符)
问题:使用正则表达式验证手机号码是否正确?
以上程序专门用于判断手机号码是否合法,但是没有办法严格限定用户填写的位数,所以我们这个时候就需要使用定位符来限定正则表达式从哪里开始查(定位符)。
定位符可以将一个正则表达式固定在一行的开始或结束。也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
\b 匹配一个单词边界
\B 匹配非单词边界
例1:使用定位符解决问题中的手机验证问题
例2:使用正则表达式中的单词边界与非单词边界
6、转义符
在正则表达式中,我们可能会用到某些特殊字符,这个时候我们可以通过\对其进行转义操作。实际开发中,以下字符都是需要进行转义的:
( ) [ ] { } * + ? .(我是点号) /
示例代码:
7、选择匹配符
在正则表达式中,可以通过|来表示选择匹配符,其可以匹配多个规则。
示例代码:
\.(jpg|png|gif|bmp)
8、特殊用法
① (匹配结果?=expr) :正向预查
② (匹配结果?!expr) :负向预查
③ (?:) :输出结果但不捕获
六、正则工具箱
1、设计原理图
2、具体代码实现参考(demo16_tools.html)
七、正则作业
1、使用正则表达式验证邮箱地址是否合法
2、使用正则表达式验证IP地址是否合法
设置IP地址:
192.168.57.10
IP地址的要求:要求第一个IP端为1~223,其他三位可以是0-255
3、使用php手册结合正则表达式采集百度首页图片
通过file_get_contents结合正则方法preg_match_all方法+正则表达式,采集百度图片