什么是正则表达式
检索文本时,可以对字符串内容进行模式匹配。RegExp 就是这种模式。用RegExp对象表示正则表达式。
创建正则表达式
- 直接量定义
/pattern/attributes
var regExp = /abc/;
//可以添加修饰符,可以同时使用
/abc/g 全局匹配,查找所有匹配
/abc/i 大小写不敏感
/abc/m 执行多行匹配
- 构造函数创建对象
new RegExp(pattern, attributes);
var regExp = new RegExp('abc','gi');
var regExp1 = new RegExp(regExp);
//通过new创建的对象和参照对象是两个不同的对象,可以通过给一个对象增加属性验证。
//如果 pattern 是正则表达式,而不是字符串,则必须省略修饰符参数。
var regExp2 = RegExp(regExp);
//不使用new关键字,新创建对象和原对象是同一个。
- 区别
var regExp = /\w/g; // \w 中包含下划线
var regExp1 = new RegExp('\\w','gi'); // 在字符串中会转义
返回值
如果参数 pattern 是正则表达式而不是字符串,创建一个新的 RegExp 对象,模式与标志与指定、参照的对象相同。
如果不用 new 运算符,则 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern。
RegExp对象的方法
1:RegExp.test() : 检索字符串中的指定值。返回值是 true 或 false。
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
// true
2:RegExp.exec() : 检索字符串中的指定值。返回值是数组。如果没有发现匹配,则返回 null。
var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free"));
// e
如果需要找到所有某个字符的所有存在,可以使用 “g” 参数,exec() 的工作原理如下:
- 找到第一个 “e”,并存储其位置 [ lastIndex ]
- 如果再次运行 exec(),则从存储的位置开始检索,并找到下一个 “e”,并存储其位置
var patt1=new RegExp("e","g");
do
{
result=patt1.exec("The best things in life are free");
document.write(result);
}
while (result!=null)
// eeeeeenull 每次循环落下一个结果
var str = "Hello World! Hello W3School!";
var patt1 = /\w+/g;
do {
result = patt1.exec(str);
console.log(result);
} while (result != null)
var str = "Hello World! Hello W3School!";
var patt1 = /\w+?/g;
do {
result = patt1.exec(str);
console.log(result);
} while (result != null)
string.match(regExp) : 返回数组
string.replace():将正则表达式匹配出的字符替换成目标字符
var regExp = /bb/gm;
var str = 'aabbbcc';
str.replace(regExp,'cc');
-----------------------------------------------
var regExp = /(\w{4})(\w{4})/gm; 玩子表达式:反向引用
var str = 'aaaabbbb';
str.replace(regExp,'$2$1'); 替换子表达式位置
str.replace(regExp,function($,$1,$2){
return $2 + $1;
})
-----------------------------------------------
var regExp = /(\w{4})(\w{4})/gm;
var str = 'aaaabbbbd';
str.replace(regExp,function(){
return 'c'
}) //cd
-----------------------------------------------
var regExp = /-(\w)/g;
var str = 'your-first-name';
str.replace(regExp,function($,$1){
return $1.toUpperCase();
})
-----------------------------------------------
str = 'aaaabbbbccccdddd';
var regExp = /((\w{4})(\w{4}))/g; [aaaabbbb,ccccdddd]
var regExp = /^((\w{4})(\w{4}))/g; [aaaabbbb] 以其开头
-----------------------------------------------
有几个括号就有几个子表达式。
regExp = /(?:()())/g; 忽略掉外层表达式
-----------------------------------------------
str = aabb;
regExp = /((\w{2})(\w{2})\1\2)/g;
子表达式1:aabb
2:aa
3:bb
aabb[前面匹配的结果]aabb[\1]aa[\2]
str = 'aaaabbbbccccdddd';
var regExp = /((\w{4})(\w{4}))/g;
regExp.exec(str);
第一位匹配元素,子表达式1,字表达式2
str = '100000000000'
var regExp = /(?=(\d{3})+$)/g;
str.replace(regExp,'.');
- ( . )
- (\w)
单词字符包括:a-z、A-Z、0-9,以及下划线。不包含汉字。
- (\W)
- (\s)
空白字符可以是:
空格符 (space character)
制表符 (tab character)
回车符 (carriage return character)
换行符 (new line character)
垂直换行符 (vertical tab character)
换页符 (form feed character)
- (\b)
通常用于查找位于单词的开头或结尾的匹配
匹配的单词边界的长度为零。(不要与 [\b] 混淆。)
/\bm/ 匹配 "moon" 中的 'm';
/oo\b/ 不匹配 "moon" 中的 'oo',因为 'oo' 后面的 'n' 是一个单词字符;
/oon\b/ 匹配 "moon" 中的 'oon',因为 'oon' 位于字符串的末端,后面没有单词字符;
/\w\b\w/ 不匹配任何字符,因为单词字符之后绝不会同时紧跟着非单词字符和单词字符。
- (\B)
通常用于查找不处在单词的开头或结尾的匹配
匹配位置的上一个和下一个字符的类型是相同的:即必须同时是单词,或必须同时是非单词字符。字符串的开头和结尾处被视为非单词字符。
- (+)
- (*)
可以用于检索两个以上,附加作用
- (?)
- ({X})
- ({X,Y})
- ({X,})
- ($)
- (^)
- (?=)
- (?!)
实例
/abc/ 匹配字符串整体
/[abc]/ 匹配满足范围里的任意一个字符
/[^123]/ ^ 在[]才是非的意思
/[A-Z0-9]/ 匹配满足范围里的任意一个字符
/[A-z][0-9]/ 匹配两个字符:分别满足各自范围要求
/(red|blue|green)/ 匹配其中任何一个
/[\w\W]/ 相当于匹配全部字符,任选其一
/aa/ [aa]
/aa/g [aa,aa,aa]
/(aa)/
/(aa)+/ [aaaa]
/aa+/ [aaaaa]
/a{2,4}/ [aa,aa] 贪心匹配原则
/a{2,4}?/ [aaaa] 非贪心匹配
/a+?/ [a,a,a,a]
/a*?/ [ , , , , ]
/(\w)(\w)\1/ 反向引用,当第一个任意字母匹配后,第三位同步第一位
// 已经匹配成功的字符不会重复匹配
/is(?=all)/ 正向预查
/^a/gm str = 'andfsde\nabiu' [a,a]
/^a/g [a]