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。