Javascript正则表达式
正则表达式是对字符串的结构进行描述,简单说它就是描述字符串的字符排列规律。它是字符串匹配和处理方面的高手。
正则写法
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:检索字符串中指定的值。返回找到的值,并确定其位置。
test:正则匹配字符串,返回boolean。
compile :编译正则表达式。
支持正则表达式的 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
总结
个人感觉正则表达式初学时,最容易被那些符号的组合给搞晕。所以弄清楚那些符号的含义非常重要。
还有看到很长的正则表达式时莫着急,尝试用拆分法各个击破。不明白的符号含义,及时查资料直到弄懂为止。