正则表达式是对 字符串 的结构进行描述,简单说它就是描述字符串的字符排列规律。 它是字符串匹配和处理方面的高手。
1. 简写 :/pattern/[attributes]
var reg = /abc/; // 字面量方式
2. 全写 :new RegExp(pattern[, attributes])
var reg = new RegExp("abc");
其中attributes为 “g”(全文查找 )、“i”(忽略大小写) 和 “m”(多行查找)的任意组合,默认值都是“非”。
var reg = new RegExp("a","gi”); // 匹配所有的a或A
当正则为变量时,只能用全写方式。
var str = “abc”; var reg = new RegExp(str);
exec: 检索字符串中指定的值。返回找到的值,并确定其位置。 boolean 。
支持正则表达式的 String 对象的方法
search :字符串匹配正则,返回 位置 (失败返回: -1 ),类似string.indexOf()
match : 字符串匹配正则,返回 数组 (失败返回: null )
replace : 字符串匹配正则,匹配成功的字符被替换成新的字符串。
split : 把字符串分割为字符串数组。
( [ { / ^ $ | ) ? * + .
元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,必须对这些 元字符 转义 。
. 查找单个字符,除了换行和行结束符。(小数点)匹配任何除了新一行开头字符的任何单个字符。
/w 查找单词字符:数字、字母、下划线 。 等价于 [A-Za-z0-9_] 。
/W 查找非单词字符。 等价于 [^A-Za-z0-9_] 。
/d 查找数字。 等价于[0-9] 。
/D 查找非数字字符。 等价于[^0-9] 。
/s 查找空白字符。 包括空格、制表符、换页符和换行符。
/S 查找非空白字符。
/b 匹配单词边界:起始、结束、空格
/B 匹配非单词边界。
/0 查找 NUL 字符。
/n 查找换行符。
/f 查找换页符。
/r 查找回车符。
/t 查找制表符。
/v 查找垂直制表符。
/xxx 查找以八进制数 xxx 规定的字符。
/xdd 查找以十六进制数 dd 规定的字符。
/uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
/ 对于其后的平常被当作字面量的字符,将其转义为特殊字符。
n+ 匹配任何包含至少一个 n 的字符串。等价于 n{1,}
n* 匹配任何包含零个或多个 n 的字符串。等价于 n{0,}
n? 匹配任何包含零个或一个 n 的字符串。等价于 n{0,1}
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^ n 匹配任何开头为 n 的字符串。当这个字符出现在一个 字符集合 模式的第一个字符的时候,它将会有不同的意义。比如,/[^a-z/s]/会匹配“my 3 sisters”中的‘3’
?=n 匹配任何其后 紧接 指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
如果 '?' 紧跟在在任何量词 *, + , ?, {} 的 后面 ,将会使量词变成 非贪婪模式 (匹配最少的次数),和默认的贪婪模式(匹配最多的次数)正好相反。
比如,使用 //d+/ 非全局的匹配“123abc”将会返回“123”,如果使用 //d+?/ ,那么就只会匹配到“1”。
字符类
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red | blue | green) 查找任何指定的选项。
把正则的整体叫作“母亲”,把从左边起第一个小括号里的正则,叫作第一个子项,
第二个小括号里的正则就是第二个子项,依此类推。
小括号,它在正则表达式中可以被用做是一个记忆设备。这一部分正则所匹配的字符将会被记住,在后面可以被利用。
可匹配子项的方法有:replace、match(正则 不加g时才匹配子项 ,且返回数组的第一项为正则整体)
每次执行完正则匹配后,RegExp的属性都会被重置为当前正则匹配结果 ,比如RegExp.$1第一个子项,RegExp.$9第九个子项。
var re = /(/w+)/s(/w+)/; var str = "John Smith"; var newstr = str.replace(re, "$2, $1"); console.log(newstr); // output: Smith John
(x) 匹配‘x’并且 记住匹配项 。这个被叫做 捕获括号 。 比如,/(foo)/匹配和记住了“foo bar”中的'foo'。匹配到子字符串可以通过结果数组的[1],...,[n]元素进行访问。
(?:x) 匹配'x'但是 不记住匹配项 。这种被叫做 非捕获括号 。匹配到的子字符串不能通过结果数组的[1],...,[n]进行访问。
x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做 正向肯定查找 。比如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat':
/Jack(?=Sprat)/.exec("JackSprat"); // output: ["Jack"]
x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做 正向否定查找 。比如,//d+(?!/.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。
//d+(?!/.)/.exec("3.141") ; // output: ["141"],而不是3.141
new RegExp(" ( // s|^ ) " + className + " ( // s|$ ) "): 匹配元素的样式名
replace(/ (/d{3}) /d{3,4} (/d*) /, " $1 **** $2 "): 替换手机号的中间3-4位数字为星号 ,支持6+位的手机号号。
"13412345678".replace(/(/d{3})/d{3,4}(/d*)/, "$1****$2"); // output: 134****5678
/ [+-]? ( ?: /d*/. | ) /d+ (?:[eE][+-]?/d+ | ) / : 匹配数字(参见jquery2.0.3源码的67行)
// Used for matching numbers core_pnum = /[+-]?(?:/d*/.|)/d+(?:[eE][+-]?/d+|)/.source,
这个正则中的竖线 | ,初次看上去有点疑惑,因为右侧是空的,那就是表示什么的没有,也就是nothing。 其实也就是想表达:要么有,要么没有的意思,那么用问号来表达应该更容易理解些。大神们写的代码就是不一样,呵呵~
/[+-]? /d* /.? /d+ (?:[eE][+-]?/d+)?/i
总结
个人感觉正则表达式初学时,最容易被那些符号的组合给搞晕。所以弄清楚那些符号的含义非常重要。
还有看到很长的正则表达式时莫着急,尝试用拆分法各个击破。不明白的符号含义,及时查资料直到弄懂为止。