掌握JavaScript正则表达式的精髓

发表时间: 2024-03-04 10:28

1. 什么是正则表达式

正则表达式就是记录文本规则的代码


正则表达式是由普通字符(例如字符 a A到 zZ)以及特殊字符(称为元字符)组成的文字模式。

正则表达式作为一个模板, 将某个字符模式与所搜索的字符串进行匹配。

在处理程序或网页时, 经常会有查找或替换符合某些复杂规则的字符串的需要。

2. 历史

正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。

1956年, 一位叫Stephen Kleene的数学家在McCulloch和Pitts早期工作的基础上, 发表论文使用了正则表达式。

正则表达式的第一个实用应用程序就是Unix中的qed编辑器

3. 作用

①对表单域项目(用户名、密码、邮箱、qq号码、手机等等)进行验证

13\d{9}[1-9]\d{4,11}

②网络爬虫(信息采集)(一个网站到另一个网站的页面上去获取对方的相关信息)

③内容替换、获取

4. 使用正则

正则组成内容:

普通字符(字母/数字/标点符号/特殊符号)、定义字符集、组合字符集、特殊字符集、限制字符集、模式修正符等

<script type="text/javascript">//简单使用正则//被匹配字符串var str = "this is Monday";//定义正则var reg = /was/;var str = "lksdl%&@@#%@_--";var reg = /lksdl%&@@#%@_-/;//进行匹配//被匹配字符串.match(正则); 会返回匹配的对象结果//没有匹配到就返回 nullvar rst = str.match(reg);document.write(rst);</script>

4.1 定义字符集组成

定义字符集

[a-e]表示a到e这些字符中的某一个字符

[aeiou]表示aeiou这5个字符其中的某一个字符

[a-zA-Z]表示大写、小写字母中的某一个字符

[a-zA-Z0-9_-]

[0-9]表示0到9之间任意一个数字

[5-9]

[9-3] [z-a] 不能从大往小写,有语法错误

<script type="text/javascript">//定义字符集//没有特殊说明,都是“单次匹配”//从字符串左边寻找到第一个符合正则的内容即可//[a-z] [c-g]var str = "hello";var reg = /[b-f]/; //[e]var reg = /[a-z]/; //[h]//[a-zA-Z]var str = "BeiJing";var reg = /[a-zA-Z]/; //["B"]var reg = /[a-z]/; //["e"]//[a-zA-Z_]var str = "Tom_123@163.com";var reg = /[a-zA-Z_]/; //["T"]//[0-9] [5-7]var reg = /[4-9]/; //["6"]//var reg = /[9-3]/; //错误用法//[ympwx]var reg = /[ympwx]/; //["m"]var rst = str.match(reg);document.write(rst);</script>

4.2 特别字符组成

特别字符

$ : 匹配输入字符串的结尾位置。

^ : 表示字符串的开始位置

( ): 标记一个子表达式的开始和结束位置。

* : 其前面那个单元出现0次或以上(任意次数)

. : 匹配除换行符 \n之外的任何单字符 .*

+ : 其前面那个单元出现1次或以上

? : 其前面那个单元出现0次或1次

\ : 这个符号是用来转义的

| : 指明两项之间的一个选择

<script type="text/javascript">//特别字符集//没有特殊说明, 都是"单次匹配"//从字符串左边寻找到第一个符合正则的内容即可//"单次部分"匹配//+ : 其前面那个单元出现1次或以上var str = "2015-6-7";var reg = /[0-9]+/;//["2015"]var str = "gooogle";var reg = /go+gle/;//["gooogle"]//* : 其前面那个单元出现0次或以上(任意次数)var str = "todayis20150607";var reg = /[0-9]*/;//[""] 出现0次数字, *还有一层含义, 必须以前面那个单元开头var str = "2015-0607todayis";var reg = /[0-9]*/;//["2015"] 出现8次数字//? : 其前面那个单元出现0次或1次var reg = /go?gle/;var str = "google";//nullvar str = "gogle";//["gogle"]var str = "ggle";//["ggle"]var rst = str.match(reg);document.write(rst);</script>
<script type="text/javascript">//特别字符集//没有特殊说明, 都是"单次匹配"//从字符串左边寻找到第一个符合正则的内容即可//| : 或, 指明两项之间的一个选择var str = "tom like pear,monkey like banana, cat like fish";var reg = /banana|pear/;//["pear"]//. : 匹配除换行符 \n之外的任何单字符 .*var str = "slkdl(*(*^*&GHOIUY\n*&TGUIHU^$%#$%";var reg = /.*/;//["slkdl(*(*^*&GHOIUY"]//\ : 这个符号是用来转义的// 把一些符号的特殊意思去掉,只保留符号最本质的意思var str = "192.168.32.56";var reg = /[0-9]+\.[0-9]+/;var str = "hello*world";var reg = /hello\*world/;//["hello*world"]var rst = str.match(reg);document.write(rst);</script>
<script type="text/javascript">//特别字符集//没有特殊说明, 都是"单次匹配"//从字符串左边寻找到第一个符合正则的内容即可//^ : 表示字符串的开始位置(托字符)var str = "Monkey like banana";var reg = /^banana/; //banana必须作为字符串的开始位置出现var reg = /^Monkey/; //["Monkey"] Monkey必须作为字符串的开始位置出现//$ : 匹配输入字符串的结尾位置。var reg = /banana$/;//banana必须出现在字符串的结尾位置//【每个正常的正则表达式都要使用^和$符号】//可以通过正则对目标字符串进行"整体"匹配//{m}前边单元严格出现m次var str = "13587287167";var reg = /^13[0-9]{9}$/;var rst = str.match(reg);document.write(rst);</script>
<script type="text/javascript">//特别字符集//没有特殊说明, 都是"单次匹配"//从字符串左边寻找到第一个符合正则的内容即可//( ): 标记一个子表达式的开始和结束位置。// 同时成为"模式单元"// 作用:// ① 提高子表达式优先级var reg = /(go)+gle/;var str = "gooooogle";//nullvar str = "gogogogogogogle";//["gogogogogogogle", "go"]// ② 从一个大的字符串里边拆分小的内容出来var str = '<h3 style="padding-bottom:0px;">06月07日</h3>';var reg = /<.*>(.*)<.*>/;//["<h3 style="padding-bottom:0px;">06月07日</h3>", "06月07日"]var str = "2015-06-07";var reg = /([0-9]+)-([0-9]+)-([0-9]+)/;//["2015-06-07", "2015", "06", "07"]var rst = str.match(reg);//document.write(rst[1]);//06月07日//document.write("月份:"+rst[2]);//月份:06document.write(rst);</script>

4.3 模式修正符组成

var 模式名称 = /模式内容/模式修正符;

模式修正符:

i 忽略大小写

g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止), 进行全局匹配的时候不给体现"模式单元"内容

请注意, 无论 RegExpObject 是否是全局模式, exec() 都会把完整的细节(子表达式)添加到它返回的数组中

<script type="text/javascript">//模式修正符//i->忽略大小写//g->全局匹配(查找所有匹配而非在找到第一个匹配后停止), 进行全局匹配的时候不给体现"模式单元"内容var str = "BeiJing and ShangHai";var reg = /[a-z]+/ig;//["BeiJing", "and", "ShangHai"]var str = "BeiJing and ShangHai";var reg = /[a-z]+/i; ["BeiJing"]var str = "2015-06-07";var reg = /[0-9]+/g;//["2015", "06", "07"]var str = "2015-06-07";var reg = /[0-9]+/; //["2015"]var str = "2015hello1997xianggang";var reg = /[0-9]+([a-z]+)/g;//["2015hello", "1997xianggang"]var str = "2015hello1997xianggang";var reg = /[0-9]+([a-z]+)/;//["2015hello", "hello"] 子表达式var rst = str.match(reg);document.write(rst);</script>
4.4 匹配中文var str = "一本书";var re = /[\u4e00-\u9fa5]人类/g;//匹配汉字console.log(str.match(re)) //[一本]