1.正则表达式:Regular Expression(RegExp)--按照某种规则去匹配符合条件的字符串。
2.RegExp对象的创建方式:
(1).字面量
var reg = / 规则/;
看两个示例
var reg = /\bis\b/;
'He is a boy. This is a dog. Where is she?'.replace(reg,'IS');
-------"He IS a boy. This is a dog. Where is she?"
var reg = /\bis\b/g; //g代表全局搜索
'He is a boy. This is a dog. Where is she?'.replace(reg,'IS');
-------"He IS a boy. This IS a dog. Where IS she?"
(2).构造函数:var reg = new RegExp('规则');
var reg = new RegExp('\\bis\\b'); // 用到了转义字符\
'He is a boy. This is a dog. Where is she?'.replace(reg,'IS')
------"He IS a boy. This is a dog. Where is she?"
var reg = new RegExp('\\bis\\b','g');
'He is a boy. This is a dog. Where is she?'.replace(reg,'IS')
---------"He IS a boy. This IS a dog. Where IS she?"
3. 对RegExp规则的访问修饰符:g i m
g:全文搜索
i:忽略大小写搜索
m:多行搜索:若不指定 m,则:^ 只在字符串的最开头,$ 只在字符串的最结尾。
若指定 m,则:^ 在字符串每一行的开头,$ 在字符串第一行的结尾。
//不加g,只会匹配一处。加了g,匹配所有。
//不加i,大小写严格区分;加了i,忽略大小写。
var reg = /\bis\b/g;'He is a boy. Is he LiMing?'.replace(reg,'SS')
-------"He SS a boy. Is he LiMing?"
var reg = /\bis\b/gi;
'He is a boy. Is he LiMing?'.replace(reg,'SS')
-------"He SS a boy. SS he LiMing?"
var reg = /\bis\b/gim;
'He is a boy.\nIs he LiMing?\nOh MY Gold!He is Tom'.replace(reg,'SS');
----"He SS a boy.
----SS he LiMing?
----Oh MY Gold!He SS Tom"
//m小例
var reg=/^@\d/g;
'@123\n@456\n@678'.replace(reg,'Q')
---"Q23
---@456
---@678"
var reg=/^@\d/gm;
'@123\n@456\n@678'.replace(reg,'Q')
---"Q23
---Q56
---Q78"
4. 元字符:在正则表达式中有特殊含义的非字母字符
常用元字符
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配行的开始
$ 匹配行的结束
常用反义元字符
代码 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
常用重复限定符
代码 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
详情,参考一下
http://www.cnblogs.com/kissdodog/archive/2013/04/22/3036649.html,写的挺好的。
5. 贪婪模式: 正则表达式在匹配时,默认是贪婪模式,就是尽可能多的匹配
比如:
\d{3,6}:那么默认是匹配6次。如果想变成非贪婪模式,则在最后加?,即\d{3,6}?
'12345667'.replace(/\d{3,6}/g,'Q')
-------"Q67"
'12345667'.replace(/\d{3,6}?/g,'Q')
-------"QQ67"
6. 分组():
'a1b2c3dafd'.replace(/([a-z]\d){3}/g,'Q')
----------"Qdafd"
反向引用 $1
2016-12-25--->11/23/2016
'2012-02-23'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1')
-----"02/23/2012"
忽略分组 ?:
(?:\d{4})-(\d{2})-(\d{2}) 则第一个不算是分组内容了,从第二个开始算$1,$2
'2012-02-23'.replace(/(?:\d{4})-(\d{2})-(\d{2})/,'$2/$1/$3')
"23/02/$3"
7.前瞻:正则表达式从文本头部向尾部开始解析,文本尾部方向,称为‘前’.前瞻就是在正则表达式匹配到规则的时候,向前介绍是否符合断言,后顾方向相反。JS不支持后顾。
正向前瞻: exp(?=assert) 负向前瞻: exp(?!assert)
示例
'a24c&45sad'.replace(/\w(?=\d)/g,'Q')
-----"QQ4c&Q5sad"
'a24c&45sad'.replace(/\w(?!\d)/g,'Q')
------"a2QQ&4QQQQ"
8.RegExp对象的属性:
lastIndex:当前表达式匹配内容的最后一个字符的下一个位置。在非全局中是没有意义的,总是返回0
source:正则表达式的文本字符串。注意点:文本内容不包括对象属性的gim。
var reg1 = /\w/
reg1.source
----------"\w"
var reg2=/\d\w/gim
reg2.source
---------"\d\w"
9. RegExp对象的test方法和exec方法
(1).test():用于测试字符串参数中是否存在匹配正则表达式模式的字符串,有返回true。不需要全局。写上反而容易出现问题。
var reg1=/\w/
var reg2=/\w/g
reg1.test('a')----永远是true
reg2.test('a')---第一遍是对的,第二遍是错的,第三遍是对的...循环.和lastIndex有关系。
(2).exec()使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。如果没有匹配的文本则返回null,否则返回一个结果数组(index声明匹配文本的第一个字符的位置。
var reg4 = /\d(\w)(\w)\d/g //正则表达式
var ts = '1az2bb3cy4de5ed' //被匹配字符串
while(r = reg4.exec(ts)){ //第一次 r=1az2 第二次=3cy4
console.log(reg4.lastIndex+'\t'+r.index+'\t'+r)
}
-----4 0 1az2,a,z
10.字符串对象和正则表达式相关的方法
(1).search():不执行全局匹配,它忽略g标志,每次都从字符串的开始进行检索。返回索引的位置,如果没有返回-1
'a1b2c3d4'.search('a1')
----0
'a1b2c3d4'.search('d')
-----6
(2).match()
非全局调用--找到返回数组,没有找到返回null
var reg3=/\d(\w)\d/
var ts = '$1a2b3c4d5e';
var ret = ts.match(reg3);
console.log(ret)
----------["1a2", "a", index: 1, input: "$1a2b3c4d5e"]
全局调用:没有找到任何匹配的字串,返回null;如果找到了一个或者多个匹配字串,则返回一个数组。数组中存放的是字符串中所有的匹配字串,而且也没有index属性或input属性。
var reg4 = /\d(\w)\d/g
console.log(ts.match(reg4))
------["1a2", "3c4"]
如有不足,欢迎指正!