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 相关文章推荐
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
js实现回放拖拽轨迹从过程上进行分析
Jun 26 Javascript
JS动态创建DOM元素的方法
Jun 09 Javascript
Sea.JS知识总结
May 05 Javascript
javascript运算符语法全面概述
Jul 14 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
Aug 25 Javascript
js实现自定义路由
Feb 04 Javascript
js实现前端图片上传即时预览功能
Aug 02 Javascript
angularJS的radio实现单项二选一的使用方法
Feb 28 Javascript
浅谈js闭包理解
Mar 28 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
Aug 27 Javascript
javascript自定义右键菜单插件
Dec 16 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
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
JavaScript EasyPager 分页函数
2011/05/25 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
python中的lambda表达式用法详解
2016/06/22 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python3几个常见问题的处理方法
2019/02/26 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
试用期员工考核制度
2014/01/22 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
运动会拉拉队口号
2014/06/09 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS