浅析JavaScript正则表达式
1.正则表达式的定义
正则表达式是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能,JavaScript的正则表达式语法是Perl5的正则表达式语法的大型子集
1.直接量定义(perl风格,本人较习惯用直接量):var reg = /exp/attributes
var pattern = /ccy$/;//匹配以ccy结尾的字符串;
注:同一段代码所表示的正则表达式每次运行时直接量会转换成不同的RegExp对象
2.RegExp对象定义(js风格):var reg = new RegExp(exp, attributes);
var pattern = new RegExp("ccy$");;//匹配以ccy结尾的字符串;
2.直接量字符
正则表达式中的所有字母和数字都是按照字面含义进行匹配的。JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜杠作为前缀进行转义。
字母和数字字符 | 自身 |
\o | NUL字符 |
\t | 制表符 |
\n | 换行符 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车符 |
\xnn | 由十六进制nn指定的拉丁字符 |
\uxxxx | 由十六进制xxxx指定的Unicode字符 |
\cX | 控制符^X |
demo:
/\n/.test('\nccy');//true 匹配 \nccy
/\n/.test('\\nccy');//false 不匹配 \ccy
/\n/.test('\\\nccy');//true 匹配 \\nccy
3.字符匹配
字符 | 匹配 |
[...] | 方括号内的任意字符 |
[^...] | 不在方括号内的任意字符 |
. | 除换行符和其他Unicode行终止符之外的任意字符 |
\w | 任何ASCII字符组成的单词,等价于[a-zA-Z0-9] |
\W | 任何非ASCII字符组成的单词,等价于[^a-zA-Z0-9] |
\s | 任何Unicode空白符 |
\S | 任何非Unicode空白符 |
\d | 任何ASCII数字,等价于[0-9] |
\D | 任何非ASCII数字,等价于[^0-9] |
[\b] | 退格直接量 |
demo:
/\w\w\d\d\d/.test('lt666');//true 匹配两个字母或者数字加三个数字的字符串
4.重复字符匹配
字符 | 匹配 |
{n,m} | 前一项至少n次,但不超过m次 |
{n,} | 前一项n次或者更多次 |
{n} | 前一项n次 |
? | 前一项0次或者1次,等价于{0,1} |
0 | 前一项至少1次或者更多次,等价于{1,} |
* | 前一项0次或者更多次,等价于{0,} |
demo:
/\d{4,9}/.test(1314);//true 匹配4到9个数字
//下面的例子稍微有点复杂,仔细分析也很简单
/\w{3}\s?\w{2,4}\s+javascript+\s+[^(]*/.test('ccy is javascript coder');//true 匹配3个字母或数字加0个或1个空格加2到4个字母或数字加至少1个空格加javascript加至少1个空格加0个或多个左反圆括号字符
重复匹配还种模式:非贪婪模式(尽可能的少匹配),只需在待匹配的字符后跟随一个?
??、+?、*?、{1,5}?
/\d{4,9}/.exec(131414131);//131414131
/\d{4,9}?/.exec(131414131);//1314
下面这种情况贪婪和非贪婪是一样的效果
/c+y/.exec('ccy');//ccy
/c+?y/.exec('ccy');//ccy
这是因为正则表达式的模式匹配总是会寻找字符串中第一个可能匹配的位置
5.选择、分组和引用
javascript正则语法还包括指定选择项、子表达式分组和引用前一子表达式的特殊字符。
字符 | 含义 |
| | 选择,匹配的是该符号左边的子表达式或者右边的子表达式 |
(…) | 组合,将几个项组合为一个单元,这个单元可通过* + ? | 等符号加以修饰,而且记住和这个组合相匹配的字符串以供此后的引用使用 |
(?:...) | 只组合,把项组合到一个单元,但不记忆与改组相匹配的字符 |
\n | 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也可能是嵌套的),组索引是从左到右的左括号数,(?: 形式的分组不编码 |
1.选择
字符 | 用于分隔供选择的字符,选择项的尝试匹配是从左至右,直到发现了匹配项。
注:如果左边的选择项匹配就会忽略右边的匹配项,即使它产生更好的匹配
2.组合引用
正则表达式中的圆括号 () 有多中作用:
a.一个是把单独的项组合成子表达式;
b.一个是在完整的模式中定义子模式;
c.允许在同一正则表达式的后部引用前面的子表达式,引用的是实例而非匹配模式。
注:perl风格的\n,RegExp对象则$n,以左圆括号为子表达式索引,从1开始
'AA Am 99'.match(/(\w)\1/g);//["AA","99"]
/(A+)((B|C|D)+)(E+)/.exec('ABCDE');//["ABCDE","A","BCD","D","E"];
6.指定匹配位置
正则表达式中匹配位置是一个难点
锚字符与断言
字符 | 含义 |
^ | 匹配字符串的开头,在多行检索中匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检索中匹配一行的结尾 |
\b | 匹配一个单词的边界,就是位于\w与\W之间的位置 |
\b | 匹配非单词边界的位置 |
(?=x) | 零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 |
(?!=x) | 零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。 |
(?<=X) | 零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 |
(?<!X) | 零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 |
demo:
要匹配<title>javascript</title>中的javascript,此时用断言最合适
/(?<=<title>).*(?=<\/title>)/.exec('<title>javascript</title>');//javascript
(?<=<title>)零宽度正后发断言,断言<title>在当前位置左侧;
(?=<\/title>)零宽度正先行断言,断言</title>在当前位置的右侧,/ 需要加 \ 转义
细心体会一下
不用断言截取如下
'<title>javascript</title>'.match(/^<title>(.*)<\/title>$/)[1];//javascript
7.修饰符
字符 | 含义 |
I | 不区分大小写 |
g | 全局匹配 |
m | 多行匹配模式 |
8.用于匹配模式的String方法
1.search(reg)
参数reg为正则表达式,返回第一个与之匹配的子串的起始位置,如找不到则返回-1
"javascript".search(/script/i); //4
注:search方法不支持全局检索,因为它会忽略正则表达式中的修饰符g
2.replace(reg,str)
用以执行检索与替换操作,注意出现$n则说明匹配子表达式
"javascript".replace(/javascript/gi,"JavaScript");
3.match(reg)
返回一个由匹配结果组成的数组,如果reg中设置了修饰符g,则返回的数组包含字符串中的所有匹配结果,若没有g,就不会进行全局检索,只会检索第一个匹配。
"1 plus 2 equals 3".match(/\d+/g); 返回["1","2","3"]
4.split(param)
参数可以为字符串也可以为正则表达式
"1,2,3,4,5".split(/,/);返回["1","2","3","4","5"]
我们经常会匹配浏览器中cookie值
document.cookie="name=ccy;age=18";
/(^|;| )age=([^;]*)(;|$)/g.exec(document.cookie)[2];//18
9.RegExp对象
RegExp第一个参数包含正则表达式的主体部分,也就是直接量中两条斜线之间的文本,不论是字符串直接量还是正则表达式都使用 \ 字符作为转义字符的前缀,
因此当给RegExp()传入一个字符串表述正则表达式时,必须将 \ 替换成 \\
第二个参数是可选的,只能传 g i m,或者它们的组合
var zipcode = new RegExp("\d{5}","g");
1.RegExp属性
source:是一个只读字符串,包含正则表达式的文本
global:是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符g
ignoreCase:是一个只读的布尔值,用以说明正则表达式是否带有修饰符i
multiline:是一个只读的布尔值,用以说明正则表达式是否带有修饰符m
lastIndex:是一个可读/写的整数,如果匹配模式带有g修饰符,这个属性存储在整个字符串的下一次检索的开始位置,会被exec(),test()方法用到
2.RegExp方法
exec()
执行字符串的匹配检索,类似String.match(),都会返回一个数组
test()
当调用exec方法返回不为null则调用test方法返回为true
浅析JavaScript正则表达式的更多相关文章
- JavaScript正则表达式,你真的知道?
一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...
- 【JS】javascript 正则表达式 大全 总结
javascript 正则表达式 大全 总结 参考整理了一些javascript正则表达式 目的一:自我复习归纳总结 目的二:共享方便大家搜索 微信:wixf150 验证数字:^[0-9]*$ 验证n ...
- 理清JavaScript正则表达式--上篇
在JavaScript中,正则表达式由RegExp对象表示.RegExp对象呢,又可以通过直接量和构造函数RegExp两种方式创建,分别如下: //直接量 var re = /pattern/[g | ...
- 理清JavaScript正则表达式--下篇
紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是search.replace.match和s ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识
本节内容 JavaScript 正则表达式 Django初识 正则表达式 1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...
- JavaScript正则表达式下——相关方法
上篇博客JavaScript 正则表达式上——基本语法介绍了JavaScript正则表达式的语法,有了这些基本知识,可以看看正则表达式在JavaScript的应用了,在一切开始之前,看看RegExp实 ...
- JavaScript 正则表达式上——基本语法
定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...
随机推荐
- 【project】【Maven】dynamic web module 3.1 requires 1.7
Maven导入和新建java web 项目时可能报的错. 解决方案: 1.保证 在eclipse 构建 web中关于java版本有三处需要修改统一: 右击项目,选择“propertie”===> ...
- pip更换国内源
学习Python开发,据说pip是很好用的一个Python包管理工具,于是尝试使用,但源异常慢,于是切换至国内的源(清华源). 在~/.pip/pip.conf (如果没有此文件则自行新建) 内容 [ ...
- C#当中的扩展方法
先说有用的,c#扩展方法结论: 扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型.扩展方法必须是静态方法,可以像实例方法一样进行调用.且调用同名中实际定义的 ...
- android-基础编程-ExpandableListview
ExpandableListView继承ListView,具有LIstVIew的基本功能.此外具有group/child,由组与子元素组成. 1.布局主要有是三个. a.主布局: <Expand ...
- 让用户输入一个日期字符串,将其转换成日期格式, 格式是(yyyy/MM/dd,yyyyMMdd,yyyy-MM-dd)中的一种, 任何一种转换成功都可以; 如果所有的都无法转换,输出日期格式非法。
第三种方法 while(true) { Date d; System.out.println("正在进行第一次匹配,请稍后~—~"); ...
- 11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-fi ...
- hdoj6483 A Sequence Game(ST预处理RMQ+莫队)
传送:http://acm.hdu.edu.cn/showproblem.php?pid=6483 题意:有长度为$n$的数组,对于一个子区间$[l,r]$内,存在最大值$mx$与最小值$mi$,有$ ...
- Android 从浏览器启动应用
核心逻辑为AndroidMainfest.xml里面的指定Activity里增加配置: <intent-filter> <data android:scheme="***& ...
- MySQL体系结构和存储引擎概述
MySQL体系结构和存储引擎概述 一.定义数据库和实例 数据库: 物理操作系统文件或其他形式文件类型的集合.数据库文件可以是frm.MYD.ibd 结尾的文件. 从概念上来说,数据库是文件的集合,是 ...
- Shell-12 -- case
case 是一种匹配选择执行的结构,相当于java中的switch