正则

几乎每种语言字符串类型都支持正则匹配,固定场景的字符串可能都有固定的规则,我们设定好一个规则,验证目标字符串是否符合规则。比如验证手机号码,验证邮箱等等。

正则匹配规则

先看几个简单的正则匹配规则示例:

  1. 用\d可以匹配一个数字,\w可以匹配一个字母或数字。比如:
    '11\d' 可以匹配'110',因为0是数字;'\d\d\d'也可以匹配'110',因为1、1、0都是数字;'\w\w\w' 可以匹配'abc',因为a、b、c都是数字;
  2. 使用 . 可以匹配任意字符。比如:
    'shabi.' 可以匹配'shabi?',也可以匹配'shabi!',也可以匹配'shabi。';
  3. 表示变长字符串,有这样几种匹配方式:用 * 表示任意个字符(包括0个),用+表示至少一个字符, 用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符。例如:
    ba*' 可以匹配b,ba,baa,baaa\d{2,8}可以匹配2-8个数字
  4. \s可以匹配空格。例如:
    \s+表示至少有一个空格
  5. 特殊字符,用 \ 转义匹配
    \-表示匹配-号
  6. 可以用 [] 进行范围匹配。例如:
    [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线
  7. 还有一些其他常见的规则:
    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。