正则表达式
正则表达式 - Regular Expression
- 正则表达式用于匹配(或检索、提取、替换)字符串中字符组合
- 它是在编程各个领域都会用到的一种数据模式
- 它制定了一种字符串规则,如果符合了就会匹配,否则就"不合法"
正则表达式的特点:
- 超强的灵活性、逻辑性和功能性
- 用极简单的方式操作控制复杂的字符串
- 需要一定的逻辑基础方便理解
正则表达式的组成:
- 普通字符
- 元字符
exp:
\d 匹配数字 ab\d 匹配ab后任意跟一单字符数字
元字符串:
其实元字符有很多,本文中列出一些常用的元字符,如果有兴趣查看更多,可以参考 [[MDN正则表达式]][01]
元字符 | 说明 |
---|---|
d | 匹配数字[0-9] |
D | 匹配任意非数字的字符 |
w | 匹配字母或数字或下划线 |
W | 匹配任意不是字母数字下划线 |
s | 匹配任意的空白符 |
S | 匹配任意不是空白符的字符 |
. | 匹配除换行符以外的任意单个字符 |
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
限定符
限定符 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
重复n次 | |
重复n次或更多次 | |
重复n到m次 |
其它
元字符 | 说明 |
---|---|
[] | 字符串用中括号括起来,表示匹配其中的任一字符,相当于或的意思 |
[^] | 匹配除中括号以内的内容 |
\ | 转义符 |
() | 从两个直接量中选择一个,分组 |
竖线 | 或者,选择两者中的一个。注意将左右两边分为两部分,而不管左右两边有多长多乱 |
[u4e00-u9fa5] | 匹配汉字 |
JavaScript 中使用正则表达式
-
创建正则对象
方式1:
调用RegExp对象的构造函数
var reg = new Regex('\d', 'i');
var reg = new Regex('\d', 'gi');
方式2:
使用一个正则表达式字面量,其由包含在斜杠之间的模式组成
在加载脚本后,正则表达式字面值提供正则表达式的编译。当正则表达式保持不变时,使用此方法可获得更好的性能。
var reg = /\d/i;
var reg = /\d/gi;
参数
标志 | 说明 |
---|---|
i | 忽略大小写 |
g | 全局匹配 |
gi | 全局匹配+忽略大小写 |
-
正则表达式对象的方法:
RegExp.test(str);
用正则表达式去验证字符串是否符合条件,返回值是一个布尔值
var flag = /ab\d/.test("ab12343123");
console.log(flag);
- `RegExp.exec(str);`
用正则表达式去提取字符串中符合条件的内容,返回值是一个数组,不会直接返回所有的结果,需要遍历才能取出所有值
每次使用同一个正则对字符串进行操作,获取结果不同
如果匹配完毕再次调用,返回null
var regex = /\d/g;
var str = "a1b2c3d4";
while(result = regex.exec(str)){
console.log(result);
};
-
字符串使用正则表达式
-
替换:
str.replace(regexp)
字符串使用正则替换内容,返回值是替换后的新字符串
var str = "喜欢gblog真的是太棒了";
str = str.replace(/g/,"G");
console.log(str);
-
提取:
str.match(regexp)
字符串使用正则提取内容,返回值是一个数组:包含提取出的内容
var str = "我的幸运数字是7,我的QQ号码是1234567,我的手机号是17701770177";
var phoneNum = str.match(/\d{11}/g);
console.log(phoneNum);
如果有多个符合正则规则的字符串也会一并提取出来
var str = "我的幸运数字是7,我的QQ号码是1234567,我的手机号是17701770177,阿黄的手机号是18808111188";
var phoneNum = str.match(/\d{11}/g);
console.log(phoneNum);
正则表达式的分组:
正则表达式除去对字符串的简单匹配,还有一个强大的提取字符串子串的功能:分组(Group);设置方法十分简单,使用()
括起来的就是要分的组;
var res = "北京区号:010".match(/([\u4e00-\u9fa5]*):(\d{3,4})/);
正则表达式的贪婪模式和非贪婪模式:
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。
如果忽视贪婪模式,那么在匹配字符串的时候,正则表达式可能会返回我们并不满意的结果,所以我们需要在匹配的时候注意是否开启了贪婪或者非贪婪模式.
默认情况下,?
+
*
{min, max}
都是贪婪的,也就是说,它会根据前导字符去匹配尽可能多的内容
比如:
var res1 = "abcaxc".match(/a.*c/);
var res2 = "abcaxc".match(/a.*?c/);
提供几个常用的非贪婪匹配
*? | 重复任意次,但尽可能少重复 |
---|---|
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |