RegExp 语法

字符

特殊字符需要转义,

例如,

00\d // 004
\d\d\d // 223
\w\w // f2
js.// js!

限制

+: one or more *: none or more ?: none or one {n}: exactly n chars {n, m}: n <= number of chars <= m [0-9]: range A|B: or ^: 表示行的开头 $: 表示行的结束

分组

()^(\d{3})-(\d{3,8})$ 定义了两个组。$1 匹配第一个分组

贪婪匹配

正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符

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

加个 ? 就可以让 \d+ 采用非贪婪匹配,

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

In Javascript

使用 /RegExp/ 定义,或者创建 RegExp 对象,

var re1 = /ABC\-001/; // /ABC\-001/
/* 因为字符串的转义问题,字符串的两个\\实际上是一个\ */
var re2 = new RegExp('ABC\\-001'); // /ABC\-001/

使用方式

RegExp.test() 检验,

var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false

RegExp.exe() 检验并提取分组,

var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null

String.split() 切分字符串,

/* 不用 regexp 的后果 */
'a b   c'.split(' '); // ['a', 'b', '', '', 'c']
'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']

/test/g 全局搜索,

var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;
/* === re = new RegExp('[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,直到结束仍没有匹配到

全局匹配类似搜索,因此不能使用 /^...$/,那样只会最多匹配一次。

/g 是一种特殊标志,还有 i 标志,表示忽略大小写;m 标志,表示执行多行匹配。

例子

必须以数字开头

^\d

整行匹配 ‘js’

^js$

匹配一个数字、字母或者下划线

[0-9a-zA-Z\_]

可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100',‘0_Z’,‘js2015’等等

[0-9a-zA-Z\_]+

JavaScript允许的变量名

[a-zA-Z\_\$][0-9a-zA-Z\_\$]*

变量的长度是1-20个字符

[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}

可以匹配A或B,所以可以匹配’JavaScript’、‘Javascript’、‘javaScript’或者’javascript’

(J|j)ava(S|s)cript

匹配 email 地址

/^[a-z0-9\_\.]+@[a-z0-9\-]+\.[a-z]+$/i

将数字转为中文大写

/**
 * 将数字转为中文大写
 * @param  {Number} n 原始数字
 * @return {String}   大写
 */
function daxie(n){
    if (!/^(0|([1-9][0-9]*))$/.test(n)){
        return undefined;
    }
    var unit = "千百十万千百十亿千百十万千百十个";
    if (n.toString().length > unit.length){
        return undefined;
    }
    // 得到单位的长度
    var unit = unit.substring(unit.length - n.toString().length);
    var nString = "";
    for (var i = 0; i < n.toString().length; i++){
        nString += "零一二三四五六七八九".charAt(n.toString()[i]) + unit.charAt(i);
    }
    // 去除多余的'零'
    nString = nString.replace(/零[千|百|十]/g, '零').replace(/零+/g, '零').replace(/零([万|亿|个])/g, '$1');
    // 去除末尾的'个'
    nString = nString.substring(0, nString.length - 1);
    return nString;
}

Ref