2017年11月

正则表达式

定义

正则表达式是一种描述字符串数据模式的方法,是检查、处理字符串的强力工具。

创建正则表达式

var re1 = new RegExp(“abc”);
var re2 = /abc/;

使用构造函数创建时,反斜杠的使用规则与往常相同。
使用双斜杠字面值创建时,不确定字符是否具有特殊含义,而不是字母、数字、空格式,只要在字符前加上反斜杠即可。

匹配测试

test方法

接受用户传递的字符串,并返回一个布尔值,表示字符串中是否包含能与表达式模式匹配的字符串。

var re2 = /abc/;
console.log(re2.test('abcde'));
// > true
console.log(re2.test('abxde'));
// > false

exec方法

如果无法匹配模式则返回null,否则返回一个表示匹配字符串信息的对象。
exec方法返回的对象中包含index属性,表示字符串成功匹配的起始位置。

var re2 = /abc/;
console.log(re2.exec('abcde'));
// > ["abc", index: 0, input: "abcde"]
console.log(re2.exec('abxde'));
// > null

若正则表达式中包含圆括号的子表达式分组,与这些分组匹配的文本也会出现在数组中。
第一个元素是与整个模式匹配的字符串,
其后是与第一个分组匹配的部分字符串,然后是第二个分组如此类推。

var dataTimeRE = /(\d{1,2})-(\d{1,2})-(\d{4})/;
var str = '24-8-2016';
var match = dataTimeRE.exec(str);
console.log(match);

// > ["24-8-2016", "24", "8", "2016", index: 0, input: "24-8-2016”]

字符组快捷写法

  • \d --数字符号
  • \w --字母和数字符号
  • \s --空白符号(空格,制表符,换行符等)
  • \D --非数字符号
  • \W --非字母和数字符号
  • \S --非空白符号
    . --除了换行符以外的任意符号

    部分模式重复

  • + --该元素至少重复一次
  • * --该元素至少重复一次,同时可以匹配模式不存在的情况
  • ? --可选,模式出现0次或1次
  • { } --指明模式出现的次数。{4},4次。{2,4},2~4次。{,4},0~4次。{4.},至少4次以上。

    边界

  • ^ --字符始位置
  • $ --字符结束位置
  • \b --单词边界( \w 集合)
    /^\d+$/:匹配一个或者多个数字组成的字符串。
    /^!/ :匹配任何以感叹号开头的字符串。
    /x^/ :不匹配任何字符串。

子表达式分组

如果一次性相想对多个元素使用*或者+,那么就需要使用分组。

var strRE = /boo+(hoo+)+/i;
var str = 'Booooohooooohoohoooo';
var test = strRE.test(str);
console.log(test);
// > true

选项模式

管道符号(|),表示从其左侧的模式和右侧的模式任意选择一个进行匹配。

var animalCount = /\b\d+ (pig|cow|chicken)s?\b/;
console.log(animalCount.test("15 cows"));
// > true

用例

检查手机号码

function isMobile(tel){
     return /^((\(\d{2,3}\))|(\d{3}\-))?(1[34578]\d{9})$/.test(tel);
}

获取URL的Query参数

function getQuery(name) {
    var result = location.search.match(new RegExp("[\?\&]" + name+ "=([^\&]+)","i"));
    if(result == null || result.length < 1){
        return "";
    }
    return result[1];
}

拆分host后缀

function domainarr(url){
     var durl = /http:\/\/([^\/]+)\//i;
     var hosts = url.match(durl);
     var d_arr;
     hosts = hosts[1];
     d_arr = hosts.split('.');
     return d_arr;
}