正则对象与正则表达式的基础学习
正则表达式是文字匹配的工具,它更像是一个文字模版,只要符合条件的结果都会被筛选出来。
正则表达式在使用上,它依赖于正则对象提供的方法与属性,所以使用正则表达式之前要定义正则对象。
正则表达式的两种使用方式:
1. 定义正则对象
var reg = new RegExp( /regexpression/modified ) //格式一 var reg = new RegExp( 'regexpression' , 'modified' ) //格式二
2. 直接量的方式
var reg = /regExpression/modified
* 就使用的简便方式上而言,更推荐直接量的方式。
说明一下,modified表示的是正则表达式的修饰符,它用于声明正则表达式的匹配范围与区域,例如全局匹配,多行匹配,不区分大小写等。
常用的修饰符有:i (不区分大小写) 、 g (全局查找) 、 m (多行查找)。
【正则对象的属性】
[ global ] 检查是否有修饰符g(全局查找),返回值为布尔值。
[ ignoreCase ] 检查是否有修饰符i(忽略大小写),返回值为布尔值。
[ multiline ] 检查是否有修饰符m(多行查找),返回值为布尔值。
[ lastIndex ] 返回此次匹配结果之后的第一个字符的索引,也是下次匹配的起始位置。
[ source ] 返回该正则对象的正则表达式(不返回修饰符)。
【正则对象的方法】
· exec()
可以返回匹配到的符合条件的结果,结果是一个数组,数组的第一个元素是结果本身,第二个元素存放的是匹配结果的首字母索引,第三个元素则存放的是整个文本。
· test()
根据是否匹配来返回逻辑值。匹配到则为true,否则为false。
【正则对象常用属性与方法的详解】
[ lastIndex ]
返回值是一个整数,它表示下次匹配的起始位置,也就是上次匹配之后的第一个字母的索引位置,这个索引值同时又是下一次匹配的起始位置。
lastIndex属性的值会随着exec(),test()方法的执行而改变,但是正则表达式一定要加g修饰符。
当exec()与test()方法执行时在也匹配不到符合条件的结果时,就会重置lastIndex属性的值为0。
示例:
var str = 'The rain in Spain stays mainly in the plain'; var reg = new RegExp('ain','g'); reg.exec(str) reg.lastIndex => 8 reg.exec(str).index =>5 reg.lastIndex => 17 reg.exec(str).index =>14 reg.lastIndex => 28 ret.exec(str).index =>25 reg.lastIndex => 43 ret.exec(str).index =>40 reg.lastIndex => 0
* 通过返回值比较我们可以发现:
lastIndex = index+str.length;
index : 每次匹配到的子串的首字母索引。
· exec()
exec()与test()方法每一次执行都只会返回一个匹配结果。
当正则表达式中有修饰符g,而且匹配的对象中含有多个符合条件的结果,那么想使用exec()与test()返回多个符合条件的结果的话,就需要多次执行该方法:
示例:
var str = 'The rain in Spain stays mainly in the plain'; var reg = new RegExp(/ain/g); // 第一次执行: reg.exec(str) => ['ain',index:5,input:'The rain in Spain stays mainly in the plain'] // 第二次执行: reg.exec(str) => ['ain',index:14,input:'The rain in Spain stays mainly in the plain'] // 第三次执行: reg.exec(str) => ['ain',index:25,input:'The rain in Spain stays mainly in the plain']
出现以上的情况的原因,是因为每次匹配的时候,exec(),test()方法都会以reg的lastIndex属性的值作为匹配的起始值。然后不断返回匹配的结果,一直到lastIndex值为0,则结束匹配。
因此若想一次性的输出所有匹配的结果,便需要借助循环。
var str = 'The rain in Spain stays mainly in the plain'; var reg = new RegExp(/ain/g); for(var i=0;i<str.length;i++){ console.log('你会发现lastIndex值在不断改变'+reg.lastIndex) reg.exec(str); if(reg.lastIndex==0){ break; } } -------------------------------------- Resulut: /* 你会发现lastIndex值在不断改变0 你会发现lastIndex值在不断改变8 你会发现lastIndex值在不断改变17 你会发现lastIndex值在不断改变28 你会发现lastIndex值在不断改变43 */
【总结】
总的来说在JS中支持正则语法的方法主要有:
replace()
join()
match()
search()
test()
exec()
它们的区别就是,replace、join()、match()、search() 会以正则表达式作为参数来匹配文本对象,而test()、exec() 则会以要匹配的文本对象作为参数来使用含有正则表达式的正则对象来进行匹配。
-------------------------------------------------------------------------------------------
学完了JS的正则对象,以及支持正则语法的方法后,下面我主要学习正则语法本身。
正则表达式我们可以简单的将其分为:普通字符、量词、元字符这三类。
· 普通字符
其中普通字符,就是要直接查找的常量,例如:
my name is .. 中如果只匹配name,就可以直接写成: /name/
· 量词
量词则是规定出现或者是匹配的次数。
例如 020-201023 这串数字,就可以匹配为:/^d{3}-d{6}$/
常用的量词有:
v. | 可以匹配任何单个字符,除了换行与行结束符。 |
v+ | 可以匹配1次或者是多次 |
v? | 可以匹配0次或1次。也就是内容可有可无。 |
v* | 可以匹配0次或多次。 |
v{n} | 只能匹配出现n次的内容。 |
v{n,} | 只能匹配至少出现n次的内容。 |
v{n,m} | 可以匹配出现n次 - m次的内容。 |
v$ | 匹配任何以v作为结束的内容。$也表示正则表达式匹配的结束标志 |
^v | 匹配任何以n作为开头的内容。^也表示正则表达式匹配的开始标志。 |
· 元字符
所谓的元字符就具有特殊含义的字符。
w | 匹配26个英文字母,不区分大小写 |
W | 匹配26个英文字母,不区分大小写。 |
d | 匹配0 - 9 的阿拉伯数字字符。 |
D | 匹配非数字字符。 |
s | 匹配空白字符 |
S | 匹配非空白字符。 |
匹配单词边界 | |