正则表达式手册

正则表达式 - Regular Expression
  • 正则表达式用于匹配(或检索、提取、替换)字符串中字符组合
  • 它是在编程各个领域都会用到的一种数据模式
  • 它制定了一种字符串规则,如果符合了就会匹配,否则就"不合法"
  • 本文以JavaScript中的正则表达式对象来讨论
正则表达式的特点:
  • 超强的灵活性、逻辑性和功能性
  • 用极简单的方式操作控制复杂的字符串
  • 需要一定的逻辑基础方便理解

正则表达式的组成:

  • 普通字符
  • 元字符

exp:

\d 匹配数字
ab\d    匹配ab后任意跟一单字符数字

元字符串:

其实元字符有很多,本文中列出一些常用的元字符,如果有兴趣查看更多,可以参考 [[MDN正则表达式]][01]

元字符说明
d匹配数字[0-9]
D匹配任意非数字的字符
w匹配字母或数字或下划线
W匹配任意不是字母数字下划线
s匹配任意的空白符
S匹配任意不是空白符的字符
.匹配除换行符以外的任意单个字符
^表示匹配行首的文本(以谁开始)
$表示匹配行尾的文本(以谁结束)

限定符

限定符说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复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);  //true;
- `RegExp.exec(str);`

用正则表达式去提取字符串中符合条件的内容,返回值是一个数组,不会直接返回所有的结果,需要遍历才能取出所有值

每次使用同一个正则对字符串进行操作,获取结果不同

如果匹配完毕再次调用,返回null

 var regex = /\d/g;
 var str = "a1b2c3d4";
 while(result = regex.exec(str)){
     console.log(result);
 };
 // ["1", index: 1, input: "a1b2c3d4", groups: undefined]
 // ["2", index: 3, input: "a1b2c3d4", groups: undefined]
 // ["3", index: 5, input: "a1b2c3d4", groups: undefined]
 // ["4", index: 7, input: "a1b2c3d4", groups: undefined]
  • 字符串使用正则表达式
  • 替换:str.replace(regexp)

    字符串使用正则替换内容,返回值是替换后的新字符串
    
var str = "喜欢gblog真的是太棒了";
str = str.replace(/g/,"G");
console.log(str);     //喜欢Gblog真的是太棒了
//如果要进行全局替换的话 只需要在正则表达式后加参数g即可
  • 提取:str.match(regexp)

    字符串使用正则提取内容,返回值是一个数组:包含提取出的内容
    
var str = "我的幸运数字是7,我的QQ号码是1234567,我的手机号是17701770177";
var phoneNum = str.match(/\d{11}/g);
console.log(phoneNum);//["17701770177"]

如果有多个符合正则规则的字符串也会一并提取出来

var str = "我的幸运数字是7,我的QQ号码是1234567,我的手机号是17701770177,阿黄的手机号是18808111188";
var phoneNum = str.match(/\d{11}/g);
console.log(phoneNum);//["17701770177", "18808111188"]

正则表达式的分组:

正则表达式除去对字符串的简单匹配,还有一个强大的提取字符串子串的功能:分组(Group);设置方法十分简单,使用()括起来的就是要分的组;

var res = "北京区号:010".match(/([\u4e00-\u9fa5]*):(\d{3,4})/);
// ["北京区号:010", "北京区号", "010", index: 0, input: "北京区号:010", groups: undefined]
//0: "北京区号:010"
//1: "北京区号"
//2: "010"
//输出res后是一个数组,res[0]永远是原始字符串,res[1]是第一组,res[2]是第二组

正则表达式的贪婪模式和非贪婪模式:

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。

如果忽视贪婪模式,那么在匹配字符串的时候,正则表达式可能会返回我们并不满意的结果,所以我们需要在匹配的时候注意是否开启了贪婪或者非贪婪模式.
默认情况下,? + * {min, max}都是贪婪的,也就是说,它会根据前导字符去匹配尽可能多的内容
比如:

var res1 = "abcaxc".match(/a.*c/);   //贪婪模式
var res2 = "abcaxc".match(/a.*?c/);  //非贪婪模式

提供几个常用的非贪婪匹配

*? 重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

附录:

JavaScript常用工具类

该JavaScript库主要包括了如下模块:
1、手机号码校验
2、身份证校验
3、邮箱校验
4、字符串常用类
5、简单四则运算
6、正则表达式生成工具类
7、日期工具
8、url工具
9、数组工具类
10、对象工具类


1 + 2 =

求知若飢,虛心若愚。