正则
几乎每种语言字符串类型都支持正则匹配,固定场景的字符串可能都有固定的规则,我们设定好一个规则,验证目标字符串是否符合规则。比如验证手机号码,验证邮箱等等。
正则匹配规则
先看几个简单的正则匹配规则示例:
- 用\d可以匹配一个数字,\w可以匹配一个字母或数字。比如:
'11\d' 可以匹配'110',因为0是数字;
'\d\d\d'也可以匹配'110',因为1、1、0都是数字;
'\w\w\w' 可以匹配'abc',因为a、b、c都是数字;
- 使用 . 可以匹配任意字符。比如:
'shabi.' 可以匹配'shabi?',也可以匹配'shabi!',也可以匹配'shabi。';
- 表示变长字符串,有这样几种匹配方式:用 * 表示任意个字符(包括0个),用+表示至少一个字符, 用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符。例如:
’ba*' 可以匹配b,ba,baa,baaa
\d{2,8}可以匹配2-8个数字
- \s可以匹配空格。例如:
\s+表示至少有一个空格
- 特殊字符,用 \ 转义匹配
\-表示匹配-号
- 可以用 [] 进行范围匹配。例如:
[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线
; - 还有一些其他常见的规则:
A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'。
A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'。
^表示行的开头,^\d表示必须以数字开头。
$表示行的结束,\d$表示必须以数字结束。
常见匹配示例
- 匹配一个1到20个字符的javascript合法变量名称:
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}
[a-zA-Z\_\$]表示任意一个字母下划线开头,[0-9a-zA-Z\_\$]{0, 19}表示0到19位数字字母或者下划线
- 匹配一个11位的手机号码:
^[1][3,4,5,6,7,8,9][0-9]{9}$
^[1]表示以1开头, [3,4,5,6,7,8,9]表示第二个数字是3到9的任意一个数,[0-9]{9}$表示0到9的任意数,一共是9个数字。
- 匹配一个合法的邮箱
^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$
圆括号()表示分组。^(\w)+表示至少以一个字母或者数字开头;(\.\w+)*表示任意个 . 或者数字或字母。((\.\w+)+)$表示至少一个. 或者数字字母结束
js中正则校验
两种方法,一种是使用正则对象,一种是使用/ /包括,我们前面的手机号码做测试。
var re1 = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
var re2 = new RegExp('^[1][3,4,5,6,7,8,9][0\-9]{9}$');
re1.test('11012345678'); // false
re2.test('11012345678'); // false
re1.test('18012345678'); // true
字符串分组
前面已经有提到过,使用()可以分组,分组的意思就是我们可以获取正则匹配到的分组子串。用前面的邮箱为例:
var re = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;
re.test('abc@163.com'); // true
re.exec('abc@163.com'); // ["abc@163.com", "c", undefined, "3", ".com", ".com", index: 0, input: "abc@163.com", groups: undefined]
第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。没有匹配到exec则返回null。