JavaScript系列之正则

ECMAScript5规范规定,同一段代码所表示的正则表达式直接量的每次运算都返回新对象。(这里需要注意)
在正则表达式中,许多标点符号具有特殊含义,它们是:

^ $ . * + ? = ! : | \ / ( ) [ ] { }

如果想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀,这是一条通行规则。

将直接量字符单独放进方括号内就组成了字符类。一个字符类可以匹配它所包含的任意字符。
正则表达式的重复字符语法

{n,m}匹配前一项至少n次,但不能超过m次
{n,}匹配前一项n次或者更多次
{n}匹配前一项n次
? 匹配前一项0次或者1次 ,等价于{0,1}
+ 匹配前一项1次或者多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}

非贪婪匹配只需要在待匹配的字符后跟随一个问号即可
正则表达式的模式匹配总是会寻找字符串中第一个可能匹配的位置。

字符|用于分隔供选择的字符。

(...)组合,将几个项组合为一个单元,而且可以记住和整个组合相匹配的字符串以供此后的引用使用。
(?:...)只组合,把项组合到一个单元,但不记忆与该组相匹配的字符。
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式,组索引是从左到右的左括号数。

^ 匹配字符串的开始,在多行检索中,匹配一行的开始
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 单词边界
\B 非单词边界
(?=p)  零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p)   零宽负向先行断言,用以指定接下来的字符都不必与p匹配。

i  说明模式匹配是不区分大小写
g 说明模式匹配是全局
m 在多行模式中执行匹配

用于模式匹配的String方法
search(),它的参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,它将返回-1。如果其参数不是正则表达式,则首先会通过RegExp构造函数将它转换成正则表达式,search()方法不支持全局检索,因为它忽略正则表达式参数中的修饰符g

replace()方法用以执行检索与替换操作。其中第一个参数是一个正则表达式,第二个参数是要进行替换的字符串(可以是函数)。这个方法对调用它的字符串进行检索。使用指定的模式来匹配。
如果在替换字符串中出现了$加数字,那么replace()将用与指定的子表达式相匹配的文本来替换着这两个字符。

match()方法是最常用的String正则表达式方法。它的唯一参数就是一个正则表达式(或通过RegExp()构造函数将其转换为正则表达式),返回的是一个由匹配结果组成的数组。为了和方法replace()保持一致,a[n]存放的是$n的内容。

('1 plus 2 equl 3').match(/\d+/)  //["1", index: 0, input: "1 plus 2 equl 3", groups: undefined]
('1 plus 2 equl 3').match(/\d+/g) //["1", "2", "3"]
('1 plus 2 equl 3').match(/(\d+)/) //["1", "1", index: 0, input: "1 plus 2 equl 3", groups: undefined]

split()方法的参数也可以是一个正则表达式。

RegExp对象
RegExp()构造函数带有两个字符串参数,第一个参数包含正则表达式的主体部分,也就是正则表达式直接量中两条斜线之间的文本,其中第二个参数是可选的。

source是一个只读字符串,包含正则表达式的文本。
global是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符g。
ignoreCase是一个只读的布尔值,用以说明正则表达式是否带有修饰符i。
multiline是一个只读的布尔值,用以说明正则表达式是否带有修饰符m。
lastIndex是一个可读/写的整数。如果匹配模式带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec()和test()方法用到。

exec()方法对一个指定的字符串执行一个正则表达式,如果它没有找到任何匹配,它就返回null,但如果它找到了一个匹配,它将返回一个数组。这个数组的第一个元素包含的是与正则表达式相匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的子串。属性index包含了发生匹配的字符位置,属性input引用的是正在检索的字符串。

var str='1 plus 2 equl 3'
/\d+/.exec(str)  //["1", index: 0, input: "1 plus 2 equl 3", groups: undefined]
/(\d+)/.exec(str) //["1", "1", index: 0, input: "1 plus 2 equl 3", groups: undefined]

//ECMAScript5规范规定,同一段代码所表示的正则表达式直接量的每次运算都返回新对象。(这里需要注意)
(/(\d+)/g).exec(str) //["1", "1", index: 0, input: "1 plus 2 equl 3", groups: undefined]
(/(\d+)/g).exec(str) //["1", "1", index: 0, input: "1 plus 2 equl 3", groups: undefined]

var reg=/(\d+)/g
reg.exec(str) // ["1", "1", index: 0, input: "1 plus 2 equl 3", groups: undefined]
reg.exec(str) // ["2", "2", index: 0, input: "1 plus 2 equl 3", groups: undefined]

test()方法的参数是一个字符串,如果包含正则表达式的一个匹配结果,则返回true。
调用test()和exec()等价,当exec()的返回结果不是null时,test()返回true。

相关推荐