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 相关文章推荐
mysql输出数据赋给js变量报unterminated string literal错误原因
May 22 Javascript
关于锚点跳转及jQuery下相关操作与插件
Oct 01 Javascript
原生javaScript做得动态表格(注释写的很清楚)
Dec 29 Javascript
用jQuery toggleClass 实现鼠标移上变色
May 14 Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 Javascript
js实现五星评价功能
Mar 08 Javascript
通过js修改input、select默认字体颜色
Apr 19 Javascript
解决vue里碰到 $refs 的问题的方法
Jul 13 Javascript
说说node中的可读流和可写流的区别
Jun 01 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
May 20 Javascript
教你如何用Node实现API的转发(某音乐)
Sep 20 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 similar_text 字符串的相似性比较函数
2010/05/26 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
python logging模块的使用总结
2019/07/09 Python
python实现静态web服务器
2019/09/03 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
外贸采购员求职的自我评价
2013/11/26 职场文书
迟到检讨书大全
2014/01/25 职场文书
高中军训感言500字
2014/02/24 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
辞职信格式模板
2015/02/27 职场文书
安全保证书怎么写
2015/02/28 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL