正则表达式

正则表达式 - 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次以上,但尽可能少重复

学习正则表达式的网站:

正则表达式30分钟入门

regexone

txt2re

posted @ 2021-01-24 18:23  Max_hhg  阅读(109)  评论(0编辑  收藏  举报