1 简介
正则表达式(regular exoression)是一种描述字符串数据模式的方法。简单来说他可以规定字符串格式,常用作字符串提取、匹配及验证使用。
2 创建正则表达式
有两种方式创建正则表达式:
1.使用RegExp构造函数:
var reg = new RegExp("abc");
tips:使用该方法时,需要将模式写成普通字符串,因此反斜杠的使用规则与往常相同。
2.使用斜杠(/)将模式包围起来,生成一个字面值
/pattern/modifiers; /模式/修饰符
var reg = /abc/i;
3 字符串方法使用正则表达式
3.1 search
字符串对象的search方法用于检索字符串,参数可传入字符串和正则表达式。当传入字符串时,会将字符串转换为正则表达式处理。
var str = "www darkclouds Top";
var result = str.search(/top/i); //15
3.2 replace
replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子字符串。
var str = "www darkclouds Top";
var result = str.search(/top/i,"com"); //15
4 正则表达式修饰符
前面了解了正则表达式的语法,双/后面的modifiers即表示修饰符,共有三个修饰符:
1. i:不区分大小写
2. g:全局匹配(查找所有匹配而非在找到第一个匹配后停止)
3. m:执行多行匹配。
5 正则表达式模式
- 方括号用于查找某个范围的字符:
- [abc]:查找方括号之间的任何字符。
- [0-9]:查找任何从0至9的数字。
- (x|y):查找任何以 | 分隔的选项。
- 元字符是拥有特殊含义的字符:
- \d:[0-9]:任意数字符号
- \w:[0-z0-9]:字母和数字符号(单词符号)
- \s:任意空白符号(空格,制表符,换行符等类似符号)
- \D:非数字符号
- .除了换行符以外的任意符号
- 量词
- n+:匹配任何包含至少一个n的字符串。
- n*:匹配任何包含另个或多个n的字符串。
- n?:匹配任何包含另个或一个n的字符串。
6 使用RegExp对象
6.1 test方法
test方法用于检测一个字符串是否匹配某个模式,返回boolean类型数据。
/abc/.test("abcde");
6.2 exec方法
exec方法用于检索字符串中的正则表达式的匹配,返回一个数组,存放匹配的结果。如果未找到匹配则为null。
var match = /\d+/.exec("20 one two 100");
console.log(match); //["100"]
console.log(match.index); //8
match: Array={
0:"20"
index:0
input:"20 one two 100"
length:1
}
疑问
为什么没有将所有所匹配结果都放在数组中?遇到第一个匹配就返回了?
7 匹配字符集
因此我们可以用快捷写法写日期的验证,如2017-03-09 10:24:08可以写成:
var dateReg = /\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d/;
这也太tm长了!呆会我们再换个方式处理。
我们可以将反斜杠代码用在方括号中,如[\d.]匹配任意数字或者一个句号。但是句号会使它失去特殊含义,因为.表示除了换行符意外任意符号,而原模式想匹配的是[任意数字.]。有些其他字符也会出现这种问题,比如+。
遇到这种问题,我们可以在方括号后添加脱字符(^)来排除某个字符集,即表示不匹配这组字符中的任何字符,也可以理解成非:
var notBinary = /[^01]/; //非(0或1)
console.log(notBinary.test("110010010010100")); //false
console.log(notBinary.test("11001010110001102")); //true 因为除0、1外 有2可以匹配。
8 部分模式重复
匹配一个整数(一个活多个数字的序列):
在正则表达式某个元素后面添加一个加号(+),表示该元素至少重复一次。因此/\d+/可以匹配一个或多个数字字符。
console.log(/'\d+'/.test("'123'")); //true
console.log(/'\d+'/.test("''"); //false
console.log(/'\d*'/.test("'123'"); //true
console.log(/'\d*'/.test("''")); //true
星号(*)有的含义与加号类似,但是可以匹配模式不存在的情况。在正则表达式的元素后添加星号并不会导致正则表达式停止匹配该元素后面的字符。只有正则表达式无法找到可以匹配的文本时菜考虑匹配该元素从未出现的情况。
元素后面跟一个问号表示这部分模式”可选”,即模式可能出现0次或1次。
//匹配neighbour(u出现1次),也可以匹配neighbor(u没有出现)。
var neighbor = /neighbou?r/;
console.log(neighbor.test("neighbour")); //true
console.log(neighbor.test("neighbor")); //true
跨括号({ })准确指明某个模式的出现次数。
1. /\d{4}/:表示数字只能出现4次
2. /\d{2,4}/:表示数字至少出现2次,最多出现4次。
3. /\d{ ,4}/:花括号可以省略任意一侧的数字,表示至多、至少的意思。
9 子表达式分组
如果想一次性对多个元素使用*或者+,那么你需要使用圆括号将这些元素包围起来,创建一个分组。这些操作符会将包围在括号中的那部分正则表达式当作一个整体处理。
var reg = /boo+(hoo+)+/i;
console.log(reg.test("Boohoooohoohooo")); //true
两个+字符分别作用于boo和hoo的o字符,而第三个+字符则作用于整个元组(hoo+),可以匹配hoo+这种正则表达式出现一次及一次以上的情况。
上述表达式末尾的i表示正则表达式不区分大小写,虽然模式中使用小写字母。
10 匹配和分组
test方法是匹配正则表达式最简单的方法,该方法只负责判断字符串是否与某个模式匹配。
正则表达式还有一个exec方法,如果无法匹配模式则返回null,否则返回一个表示匹配字符串信息的对象。
var match = /\d+/.exec("one two 100");
console.log(match); //["100"]
console.log(match.index); //8
exec方法返回的对象包含Index属性,表示字符串成功匹配的起始位置。除此之外,该对象是一个字符串数组,其首元素是与模式匹配的字符串。
字符串也有一个类似的match方法:
console.log("one two 100".match(/\d+/)); //["100"]
若正则表达式包含使用圆括号保卫的子表达式分组,与这些分组匹配的文本也会出现在数组中。第一个元素是与整个模式匹配的字符串,其后是与第一个分组匹配的部分字符串(表达式中第一次出现在左圆括号的那部分),然后是第二个分组。
var quotedText = /'([^']*)'/;
console.log(quotedText.exec("she said 'hello'")); ["'hello'", "hello"]
11 常用正则表达式
11.1 字符串中的重复字符
/(.).*\1/g
12 更多
更多内容请移步W3C http://www.w3cschool.cn/jsref/jsref-obj-regexp.html