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

 

总结
个人感觉正则表达式初学时,最容易被那些符号的组合给搞晕。所以弄清楚那些符号的含义非常重要。
还有看到很长的正则表达式时莫着急,尝试用拆分法各个击破。不明白的符号含义,及时查资料直到弄懂为止。

posted @ 2015-03-15 00:36  阿郎博客  阅读(...)  评论(... 编辑 收藏