正则表达式详解

时间:2022-07-03 04:41:32

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"]

如有不足,欢迎指正!