转载

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

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

正文到此结束
Loading...