一. 定义
正则表达式(Regular Expression),使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
二. 基本语法
元字符
正则表达式中有特殊含义的非字母字符
字符类
[]
可以构建一个类,比如[abc]
,匹配含有a
或b
或c
字符类取反[^]
表示匹配一个未列出的字符, 而不是匹配列出的字符
var reg=/[^ab]/g;
var string="acdadbb";
string.replace(reg,"A"); //结果为"aAAaAbb"
范围类
[]
,匹配一个范围,在其类内部是可以连写的,例如
[a-zA-Z] //匹配26个字母的大小写
预定义类
.
匹配除回车符和换行符之外的所有字符\d
匹配数字字符\D
匹配非数字字符\s
匹配空白符\S
匹配非空白符\w
匹配单词字符(字母、数字下划线)\W
匹配非单词字符
注意大小写的区分
边界
^
开始$
结束\b
单词边界\B
非单词边界
量词
?
匹配之前紧邻的元素,这个元素可以不出现,且匹配成功(最多出现一次)+
表示之前紧邻的元素出现一次或者多次,无法进行一次匹配时,会报告匹配失败(最少出现一次)*
之前紧邻的元素出现任意多次或者不出现
字符组里面的一些字符不是元字符。(任意次){n}
出现n次{n,m}
出现n到m次{n,}
至少出现n次
分组
1.()
//匹配一个字母加一个数字的前两个组合
var reg1=/[a-z]\d{2}/g;
var reg2=/([a-z]\d){2}/g; //增加()
var string="a1c2d3adbb";
string.replace(reg1,"A"); //结果为"a1c2d3adbb",没有改变,因为匹配的是字母加上出现2次的数字
string.replace(reg2,"A"); //结果为"Ad3adbb""
2.或|
var reg=/h(o|i)t/g;
var string="hothithat";
string.replace(reg,"A"); //结果为AAhat
3.反向引用
例如日期格式的转换,由2016-08-16
转换为08/16/2016
var reg=/(\d{4})-(\d{2})-(\d{2})/g;
var string="2016-08-16";
string.replace(reg,"$2/$3/$1"); //结果为08/16/2016
其中$1
表示第一组括号匹配的文本,其他类似
4.忽略分组
在分组内加上?:
var reg=/(\d{4})-(?:\d{2})-(\d{2})/g;
var string="2016-08-16";
string.replace(reg,"$2/$3/$1"); //结果为16/$3/2016,月份已经被忽略,无法通过$加数字进行访问
前瞻
文本尾部方向,为前
正向前瞻: exp(?=assert)
负向前瞻: exp(?!assert)
前瞻:匹配到规则的时候,向前检查是否符合断言,javaScript不支持后顾。
var reg=/\w(?=\d)/g; //找到字母后,判断后面是不是有数字,有的话才符合,替换掉这个字母,但是数字不会替换
var string="h2othi2";
string.replace(reg,"A"); //结果为A2othA2
三. 匹配模式
贪婪模式
极可能多地匹配
var reg=/\d{3,6}/g;
var string="123456789";
string.replace(reg,"A"); //结果为"A789",尽可能多的匹配
非贪婪模式
让正则表达式尽可能少的匹配,一旦匹配成功就不再继续尝试。方式是在量词后加上?
var reg=/\d{3,6}?/g;
var string="123456789";
string.replace(reg,"A"); //结果为"AAA",尽可能多的匹配
四. RegExp对象
创建方法
有两种方法可以创建RegExp对象
a.显式构造函数:
var reg=new RegExp("pattern"[,"flag"]);
b.隐式构造函数:
var reg=/pattern/[flags];
其中,flags可以是一些标志字符的组合
g
为全局标志,将对所有匹配的部分起作用,如果不设置,仅搜索和替换最早匹配的内容i
为 忽略大小写的标志,如果设置,忽略大小写m
为多行标志,如果设置,“^”还可以与被搜索字符串的 n 或 r 之后的位置进行匹配
例如:
/ab+c/i;
new RegExp("ab+c","i");
RegExp对象的属性
global:布尔值
ignoreCase:布尔值
lastIndex:整数,表示开始搜索下一个匹配项的字符位置
multiLine:布尔值
source:正则表达式的字符串表示
RegExp对象的方法
exec
rgExp.exec(str)
返回值:如果没有找到匹配返回null,如果找到则返回一个数组
返回的数组有三个属性,分别是input、index和lastIndex
input包含了查找的字符串,
index属性包含了整个被查找字符串中被匹配的子字符串的位置,
lastIndex属性中包含了最后一次匹配中最后一个字符的下一个位置
test
rgexp.test(str)
返回值:如果存在一个模式,返回true
match
stringObj.match(rgExp)
返回值:如果没有找到匹配返回null,如果找到则返回一个数组
返回的数组有三个属性,分别是input、index和lastIndex,input包含了查找的字符串,index属性包含了整个被查找字符串中被匹配的子字符串的位置,lastIndex属性中包含了最后一次匹配中最后一个字符的下一个位置
search
stringObj.search(rgExp);
返回值:如果存在,则返回 一个整数值,指明这个匹配距离字符串开始的偏移位置。
没有找到则返回-1
replace
replace(rgExp,replaceText);
split
split([separator[,limit]])
separator 分割标识符参数,可以是多个字符或一个正则表达式
limit 限制返回元素的个数
五. 参考资料
《JavaScript高级程序设计》
《JavaScript正则表达式》课程, Samaritan89
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。