正则表达式练习

200 阅读1分钟
  • [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

  • [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','js2015'等等;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下划线、$开头,后接任意个由一个数字、字母或者下划线、$组成的字符串,也就是JavaScript允许的变量名;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)

  • A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'。

  • ^表示行的开头,^\d表示必须以数字开头。

  • $表示行的结束,\d$表示必须以数字结束。

  • js也可以匹配'jsp',但是加上^js$就变成了整行匹配,就只能匹配'js'

切分字符串

'a b   c'.split(/\s+/); // ['a', 'b', 'c']//无论多少个空格都可以正常分割

'a,b, c  d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd']//加入,

'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']//加入;

分组

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码

var x = /^(\d{3})-(\d{3,8})$/;
x.execl('010-23232')//excel()匹配成功返回 ['010-23232','010','23232']
x.excel('112345')//excel()匹配失败返回 null

贪婪匹配

var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']

\d+采用了贪婪匹配,直接把后面的0全部都匹配了,导致0*只能匹配空字符串

var re = /^(\d+?)(0*)$/;//加个?,采用非贪婪匹配
re.exec('102300'); // ['102300', '1023', '00']

全局搜索

全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。当我们指定g标志后,每次运行exec(),正则表达式本身会更新astIndex属性,表示上次匹配到的最后索引:

var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;

// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10

re.exec(s); // ['VBScript']
re.lastIndex; // 20

re.exec(s); // ['JScript']
re.lastIndex; // 29

re.exec(s); // ['ECMAScript']
re.lastIndex; // 44

re.exec(s); // null,直到结束仍没有匹配到

验证Email地址的正则表达式:

var re = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;

//测试一下
var
    i,
    success = true,
    should_pass = ['someone@gmail.com', 'bill.gates@microsoft.com', 'tom@voyager.org', 'bob2015@163.com'],
    should_fail = ['test#gmail.com', 'bill@microsoft', 'bill%gates@ms.com', '@voyager.org'];
for (i = 0; i < should_pass.length; i++) {
    if (!re.test(should_pass[i])) {
        console.log('测试失败: ' + should_pass[i]);
        success = false;
        break;
    }
}
for (i = 0; i < should_fail.length; i++) {
    if (re.test(should_fail[i])) {
        console.log('测试失败: ' + should_fail[i]);
        success = false;
        break;
    }
}
if (success) {
    console.log('测试成功!');
}