RegExp 语法
字符
\d
: one number\w
: one number, letter.
: any single character\s
: one space(' ‘), tab('\t’)
特殊字符需要转义,
-
:\-
_
:\_
$
:\$
例如,
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;
}