JavaScript高级程序设计(第3版)学习笔记12 js正则表达式


Posted in Javascript onOctober 11, 2012

需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了。正则表达式不只是应用在ECMAScript中,在JAVA、.Net、Unix等也有相应应用,这篇文章则是以ECMAScript中的正则表达式为基础总结的。

一、正则表达式基础

1、普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如ABC123。在匹配时,匹配与之相同的字符。

2、特殊字符:(需要时,使用反斜杠“\”进行转义)

字符 含义 字符 含义 字符 含义 字符 含义
\a 响铃符 = \x07 ^ 匹配字符串的开始位置 \b 匹配单词的开始或结束 {n} 匹配n次
\f 换页符 = \x0C $ 匹配字符串的结束位置 \B 匹配不是单词开始和结束的位置 {n,} 匹配至少n次
\n 换行符 = \x0A () 标记一个子表达式的开始和结束 \d 匹配数字 {n,m} 匹配n到m次
\r 回车符 = \x0D [] 自定义字符组合匹配 \D 匹配任意不是数字的字符 [0-9] 匹配0到9中任意一个数字
\t 制表符 = \x09 {} 修饰匹配次数的符号 \s 匹配任意空白字符 [f-m] 匹配f到m中任意一个字母
\v 垂直制表符 = \x0B . 匹配除换行符外的字符 \S 匹配任意非空白字符    
\e ESC符 = \x1B ? 匹配0或1次 \w 匹配字母或数字或下划线或汉字    
\xXX 使用两位十六进制表示形式,可与该编号的字符匹配 + 匹配1或多次 \W 匹配任意不是字母、数字、下划线和汉字的字符    
\uXXXX 用四位十六进制表示形式,可与该编号的字符匹配 * 匹配0或多次 [^x] 匹配除x外的所有字符    
\x{XXXXXX} 使用任意位十六进制表示形式,可与该编号的字符匹配 | 左右两边表达式之间“或”关系 [^aeiou] 匹配除aeiou外的所有字符    

上面列举的这些特殊字符,可以大致的分为: 

(1)不便书写字符:如响铃符(\a)、换页符(\f)、换行符(\n)、回车符(\r)、制表符(\t)、ESC符(\e)

(2)十六进制字符:如两位(\x02)、四位(\x012B)、任意位(\x{A34D1})

(3)表示位置字符:如字符串开始(^)、字符串结束($)、单词开始和结束(\b)、单词中间(\B)

(4)表示次数字符:如0或1次(?)、1或多次(+)、0或多次(*)、n次({n})、至少n次({n,})、n到m次({n,m})

(5)修饰字符:如修饰次数({})、自定义组合匹配([])、子表达式(())

(6)反义字符:

(A)通过大小写反义:如\b和\B、\d和\D、\s和\S、\w和\W

(B)通过[^]反义:如[^x]、[^aeiou]

(C)其它特例:如\n和.也构成反义

(7)范围字符:如数字范围([0-9])、字母范围([f-m])

(8)逻辑字符:如表示或(|)

3、转义

(1)使用反斜杠“\”转义单个字符

(2)使用“\Q...\E”转义,将表达式中间出现的字符全部作为普通字符

(3)使用“\U...\E”转义,将表达式中间出现的字符全部作为普通字符,并且将小写字母转换成大写匹配

(4)使用“\L...\E”转义,将表达式中间出现的字符全部作为普通字符,并且将大写字母转换为小写匹配

4、贪婪模式与懒惰模式

   如果正则表达式中含有次数字符时,一般情况下,会尽可能匹配更多的字符,比如用l*n来匹配linjisong的话,会匹配linjison,而不是 lin,这种模式也就是正则表达式的贪婪模式;相对应的,可以通过添加字符“?”来设置为懒惰模式,也即尽可能匹配更少字符。如*?表示重复0次或多次, 但尽可能少重复。

5、分组和反向引用

(1)用小括号(())将表达式包含,可以使得表达式作为一个整体来处理,从而达到分组的目的。

(2)默认情况下,每个分组会自动获取一个组号,按照左括号的顺序,从1向后编号。

(3)引擎在处理时,会将小括号内部表达式匹配的内容保存下来,以方便在匹配过程中或匹配结束后进一步处理,可以使用反斜杠和组号来引用这个内容,如\1表示第一个分组匹配的文本。

(4)也可以自定义组名,语法是(?<name>exp),这个时候反向引用时,还可以使用\k<name>。

(5)也可以不保存匹配内容,也不分配组号,语法是(?:exp)。

(6)小括号有一些其他特殊语法,这里列举几种,不再深入讨论:

分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(? 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(? 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

到此,对于理解常用的正则表达式已经足够了,若想继续学习正则表达式的,可以参考正则表达式30分钟入门教程。下面再熟悉一下Javascript中的正则表达式实现。

二、Javascript中的正则表达式对象RegExp

1、创建正则表达式

(1)使用字面量:语法 var exp = /pattern/flags;

A、pattern是任何正则表达式

B、flags有三种:g表示全局模式、i表示忽略大小写、m表示多行模式

(2)使用RegExp内置构造函数:语法 var exp = new RegExp(pattern, flags);

A、使用构造函数时,pattern和flags都是字符串形式,所以对于转义字符需要双重转义,例如:

字面量 构造函数
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
/name\/age/ "name\\/age"
/\d.\d{1,2}/ "\\d.\\d{1,2}"
/\w\\helllo\\123/ "\\w\\\\hello\\\\123"

说明:ECMAScript 3使用字面量时会共享一个RegExp实例,使用new RegExp(pattern,flags)会为每个正则表达式创建一个实例;ECMAScript 5规定每次都创建新实例。

2、实例属性

(1)global:布尔值,表示是否设置了g标志。

(2)ignoreCase:布尔值,表示是否设置了i标志。

(3)multiline:布尔值,表示是否设置了m标志。

(4)lastIndex:整数,表示开始搜索下一次匹配项的字符位置,从0算起。

(5)source:字符串,表示按照字面量形式创建的字符串模式,即便实例使用构造函数创建,存储的也是字面量形式的字符串模式。

3、实例方法

(1)exec()方法

A、一个参数,即要应用模式的字符串,返回第一个匹配项信息的数组,没有匹配时返回null。

B、返回的数组是Array实例,但还额外有input和index属性,分别表示应用正则表达式的字符串和匹配项在字符串中的位置。

C、匹配时,在返回的数组中,第1项是与整个模式匹配的字符串,其他项是与模式中的分组匹配的字符串(如果没有分组,则返回数组只有1项)。

D、对于exec(),即使设置了g,每次返回的也是一个匹配项,不同的是,设置了g,多次调用exec的开始搜索位置不同,没有设置g,每次都从开始搜索。

(2)test()方法

接受一个字符串参数,匹配返回true,不匹配返回false。

三、实例分析

下面看一个出自PhoneGap源码中用于格式化的正则表达式

var pattern = /(.*?)%(.)(.*)/; 
var str = 'lin%%jisong'; 
var match = pattern.exec(str); 
console.info(match.join(','));//lin%%jisong,lin,%,jisong var pattern2 = /(.*)%(.)(.*)/; 
var match2 = pattern2.exec(str); 
console.info(match2.join(','));//lin%%jisong,lin%,j,isong

分析:这里pattern和pattern2都包含三个分组,第2、3个分组相同,第2个分组(.)匹配任意一个非换行字符,第3个分组(.*)尽可能多(贪婪模式)的匹配任意非换行字符,pattern中的第1个分组(.*?)尽可能少(懒惰模式)的匹配任意非换行字符,而pattern2中的第1个分组(.*)则是尽可能多(贪婪模式)的匹配任意非换行字符了。因此在保证整个模式匹配成功(从而需要保留一个%字符用于匹配正则表达式中的%)的前提下,pattern中第1个分组匹配成了lin,而pattern2中第1个分组匹配成了lin%,分析到这里上例中的输出也就不难理解了。

Javascript 相关文章推荐
3款实用的在线JS代码工具(国外)
Mar 15 Javascript
node.js中的fs.rmdir方法使用说明
Dec 16 Javascript
jQuery简单操作cookie的插件实例
Jan 13 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
Apr 06 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 Javascript
鼠标经过出现气泡框的简单实例
Mar 17 Javascript
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
Jul 02 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
Vue vm.$attrs使用场景详解
Mar 08 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
Jul 19 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
Oct 11 #Javascript
You might like
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
第十四节--命名空间
2006/11/16 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
php的扩展写法总结
2019/05/14 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
new修饰符是起什么作用
2015/06/28 面试题
会计工作心得体会
2014/01/13 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
平安家庭事迹材料
2014/12/20 职场文书
个人先进事迹总结
2015/02/26 职场文书
实习证明格式范文
2015/06/16 职场文书
python中对列表的删除和添加方法详解
2022/02/24 Python