正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
初级
- 在正则表达式中,如果直接给出字符,就是精确匹配。
-
\\d
可以匹配一个数字。
比如00\\d
可以匹配007
,但是00A
就不行啦。\\d\\d\\d
可以匹配123
。 -
\\w
可以匹配一个字母or数字or下划线。
\\w\\w
可以匹配A1
-
\\s
匹配空白字符。包括空格、制表符、换页符等。 -
.
可以匹配任意字符。
js.
可以匹配jsp
,js!
... - 用
*
表示任意个字符(包括0个) - 用
+
表示至少一个字符 - 用
?
表示0个或1个字符 - 用
{n}
表示n个字符
\\d{3}
表示匹配三个数字,如123
- 用
{n,m}
表示n-m个字符 - 特殊字符要用
\\
转义
比如要匹配'010-12345'
由于'-'
是特殊字符,在正则表达式中,要用'\\'
转义,所以,上面的正则是\\d{3}\\-\\d{3,8}
- 需要转义的字符
* . ? + $ ^ [ ] ( ) { } | \\ /
-
\\b
是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。
主要记住常用的\\d
数字、\\w
数字or字母or下划线、\\s
空格or制表符or换页符等的匹配。注意,都是小写字母哦。
进阶
- 更精确的匹配,用
[]
表示范围
[0-9a-zA-Z\\_]
可以匹配一个数字、字母或者下划线
[0-9a-zA-Z\\_]+
可以匹配至少一个数字、字母或者下划线
[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 -
^
表示行的开头,^\\d
表示必须以数字开头。 -
$
表示行的结束,\\d$
表示必须以数字结束。
创建RegExp的两种方式
-
/正则表达式/
直接写出 -
new RegExp('正则表达式')
创建一个RegExp对象
var re1 = /ABC\\-001/;
var re2 = new RegExp('ABC\\\\-001');// 因为转义问题,字符串的两个\\\\实际上是一个\\
re1; // /ABC\\-001/
re2; // /ABC\\-001/
检测 & RegExp对象的test()方法
用于检测给定的字符串是否符合条件。
注意这是RegExp对象自己的方法,还有match()
、search()
、replace()
、split()
都是String对象的方法。
var re = /^\\d{3}\\-\\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
切分字符串
可以用正则表达式来把不规范的输入转化成正确的数组。
'a b c'.split(' '); // ['a', 'b', '', '', 'c']
'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']
//以空白符或者逗号或者分好来分割
用问号实现非贪婪匹配
非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
var re = /^(\\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
解决:贪婪表达式字符的后面加个非贪婪符号?
当?
紧跟在任何一个其他限制符 (*, +, ?, {*n*}, {*n*,}, {*n*,*m*})
后面时,匹配模式是非贪婪的。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'
var re = /^(\\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
分组 & RegExp对象的exec()方法
如果正则表达式中定义了组,就可以在RegExp对象上用exec()方法提取出子串来
- 用
()
表示的就是要提取的分组(Group) -
JavaScript exec() 方法
exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。
exec()方法在匹配失败时返回null。
如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。
var re = /^(\\d{3})-(\\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
var str = "Visit W3School, W3School is a place to study web technology.";
var patt = new RegExp("W3School","g");
var result;
while ((result = patt.exec(str)) != null) {
document.write(result);
document.write("<br />");
document.write(patt.lastIndex);
document.write("<br />");
}
输出:
W3School
14
W3School
24