一 正则表达式概念
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
在学习正则表达式之前,需要先知道正则表达式的功能是什么,也就是我们为什么要用正则表达式。正则表达式强大之处在于它对字符串的搜索和替换。下面介绍它的常用功能。
1. 数据验证,也就是分析字符串内的模式。例如,可以测试输入字符串是否出现电话号码模式或邮箱号码模式。
2. 替换文本,我们可以使用正则表达式来识别文档中的特定文本或字符串,然后可以用指定的文本去替换被识别的文本。
3. 提取子字符串,可以用正则表达式去识别特定字符串并提取它。
在javascript中,正则表达式可以通过两种方式构造,一种是/exp/g,另一种为new RegExp(“exp”,”g”),其中exp为匹配模式。
二 正则表达式语法
1.构造函数
var reg = new RegExp('hello','g');
2.字面量
var reg = /hellog/g;
- g:global,表示全文搜索,默认是搜索到第一个结果就不再搜索
- i:ignore case,忽略大小写,默认是不忽略大小写
- m:multiple lines,多行搜索
三 正则表达式的特殊字符
字符类
- “[abc]”:简单类,匹配字符集合。此处匹配abc中任意一个字符
- “[a-z]”: 范围类,匹配字符范围内的字符,此处匹配a到z的任意小写字符
- “[^abc]”:负向类,匹配字符范围以外的任意字符,此处匹配除了a到z之外的任意字符
元字符
- “^”:匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
- “":匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性, 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
- “.”:除了换行和回车之外的任意字符,相当于[^\n\r]
- “\w”:匹配字母,数字,下划线,相当于[a-zA-Z_0-9]
- “\W”:匹配任意不是字母,数字,下划线 的字符[^a-zA-Z_0-9]
- “\s”:匹配空白字符,相当于[\t\r\n\f\v]
- “\S”:匹配任意非空白字符,相当于[^\t\r\n\f\v]
- “\d”: 匹配数字,相当于[0-9]
- “\D”: 匹配任意非数字的字符,,相当于[^0-9]
- “.”:匹配除了换行符以外的任何字符,相当于[^\n\r]
- “\b” :匹配一个字边界,即字与空格间的位置。如我想从字符串中”This is Regex”匹配单独的单词 “is” 正则就要写成 “\bis\b”。
- “\B”:匹配非字边界
- “a|b”:匹配字符a或者b
- “\f”:匹配一个换页符。等价于”\x0c”
- “\n”:匹配一个换行符。等价于”\x0a”
- “\r”:匹配一个回车符。等价于”\x0d”
- “\t”:匹配一个制表符。等价于”\x09”
- “\v”:匹配一个垂直制表符。等价于”\x0b”
- “\num”:匹配第num个匹配的引用,其中num是一个正整数。例如,’(.)\1’ 匹配两个连续的相同字符。
限定符(量词)
- “*”:重复零次或更多,尽可能多的重复
- “+”:重复一次或更多次,尽可能多的重复
- “?”:重复零次或一次,尽可能多的重复
- “{n}” :重复n次
- “{n,m}”:重复n到m次,尽可能多的重复
- “{n,}”:重复n次或更多次,尽可能多的重复
注意:*、+、?、{n,m}和{n,}限定符都是贪婪的,贪婪的意思就是尽可能多的重复,它们会尽可能多的匹配文字。只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。例:对字符串”aaa”进行匹配,表达式”a+?”只能匹配到”a”,而”a+”却能匹配到”aaa”.
四 正则表达式函数
正则表达式函数
1.test方法(一般用于数据验证)
语法:regExp.test(stringObj)
regExp:正则表达式对象
stringObj:要进行检测的字符串
功能:该方法用来检测输入的字符串是否与正则表达式相匹配。匹配成功则返回true,不成功则返回false。该方法常用于数据验证,如验证email是否符合格式。
var reg = /^\d+@qq\.com$/;
reg.test('123@qq.com');//true
/\d+\.\d{1,2}$/g.test('123.25');//true
/\d+\.\d{1,2}$/g.test('a.25');//false
2.exec方法(一般用于提取子字符串)
语法:regExp.exec(stringObj)
stringObj:被查找的字符串
regExp:正则表达式对象
功能:该方法返回一个数组,数组的第一个元素就是匹配的字符串。如果有子分组的话,数组第二个元素就是正则中的第一个子分组匹配的结果,第三个是正则中第二个子分组匹配的结果…以此类推。如果没有正则子分组,那么该数组长度仅仅为1。
var reg = /\d/g;
reg.test('1a2b3c');//true
while(r=reg.exec('1a2b3c')){
console.log(r.index+':'+r[0]);
}
//结果为
//0:1
//2:2
//4:3
3.match 方法(一般用于提取子字符串)
功能:使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。功能与exec类似。
语法:stringObj.match(regExp)
stringObj 被查找的字符串
regExp 正则表达式对象
var reg=/abc/;
reg.exec('11abc11abcdef');//["abc"]
'11abc11abcdef'.match(reg);//["abc"]
var reg=/abc/g;
reg.exec('11abc11abcdef');//["abc"]
'11abc11abcdef'.match(reg);//["abc","abc"]
//因为match执行了全局匹配查询;而exec如果没有子表达式只会找到一个匹配的即返回。
4.replcae 方法(一般用于替换文本)
功能:使用正则表达式模式对字符串执行查找,用另外的字符串去替换匹配的字符串。
语法:stringObj.replcae(regExp,stringObj2);
stringObj 被查找的字符串
regExp 正则表达式对象
stringObj2 用于替换的字符串
'abcabcabc'.replace(/bc/,"A");//aAabcabc
'abcabcabc'.replace(/bc/g,"A")//aAaAaA
'123456789'.replace('\d{3}',"$1-");