1.1 常见的判断Email地址是否合法,电话号码、身份证位数等,正则匹配就是为此而生。
正则表达式是一种用来匹配字符串的强有力武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
对于专门的正则表达式学习教程推荐:正则表达式30分钟入门教程
基本规则:
\d
匹配一个数字\w
匹配一个字母或数字.
匹配任意字符*
匹配任意个字符(包括0个)+
表示至少一个字符?
表示0个或1个字符{n}
表示n个字符{n,m}
表示n-m个字符\s
可以匹配一个空格(也包括Tab等空白符)[]
表示范围^
表示行的开头$
表示行的结尾
RegExp
JS有两种方法创建正则表达式:
- 直接通过
/.../
写出来(或者叫做字面量正则表达式) - 通过
new RegExp('正则表达式')
var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001');
re1; // /ABC\-001/
re2; // /ABC\-001/
//如果使用第二种写法,因为字符串的转义问题,字符串的两个\\实际上是一个\。
判断正则表达式是否匹配:
var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
切分字符串
用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:
//切分空格
'a b c'.split(' '); // ['a', 'b', '', '', 'c']
嗯,无法识别连续的空格,用正则表达式试试:
'a b c'.split(/\s+/); // ['a', 'b', 'c']
无论多少个空格都可以正常分割。加入,试试:
'a,b, c d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd']
分组
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()
表示的就是要提取的分组(Group):
//```^(\d{3})-(\d{3,8})$```分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
贪婪匹配
需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:
//由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
必须让\d+
采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?
就可以让\d+
采用非贪婪匹配:
var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']