javascript正则表达式之regexp,匹配string,正则指定字符
exec() 检索字符串中的指定值,返回值是被找到的值,如果没有发现匹配,则返回 null:
主要的RegExp模式匹配方法是exec(),其与上一篇介绍的String对象的match方法相似,只不过它是以字符串为参数的RegExp方法,而不是以RegExp对象为参数的字符串方法。呼,这一句有点像绕口令,没办法,书上的原话,抄过来让大家乐一乐,呵。exec()方法在一个字符串中检索匹配,如果没有找到任何匹配返回null,如果它找到了一个匹配,将返回一个数组。
就像方法match()为非全局检索返回的数组一样。这个数组的元素0包含的是与正则表达式相匹配的字符串,余下的所有元素包含的是与子表达式相匹配的子串,而且属性index包含了匹配发生的字符的位置,属性input引用的是被检索的字符串。
代码如下 | 复制代码 |
/* i is 0 http://www.xiaoxiaozi.com/index.php i is 1 http i is 2 www.xiaoxiaozi.com i is 3 index.php i is index 11 i is input my home is http://www.xiaoxiaozi.com/index.php */ var str = 'my home is http://www.xiaoxiaozi.com/index.php'; var pattern = /(w+)://([w.]+)/(S*)/; //var result = str.match(pattern); var result = pattern.exec(str); for(i in result) { document.write("i is "+i+" "+result[i]+"<br/>"); } |
与match()方法不同的是,exec()返回的数组类型不同,无论该正则表达式是否含有全局属性g。因为当含有全局属性g的时候,match()方法返回的是一个匹配的数组,而调用exec()方法的RegExp有一个lastIndex属性,它将把该对象的lastIndex属性设置到紧接着匹配子串的字符位置。
当同一个RegExp对象第二次调用exec()时,它将从lastIndex属性所指示的字符处开始检索,如果exec()没有发现任何匹配,它会将lastIndex属性重围为0,(在任何时候你都可以将lastIndex属性设为0,每当你在一个字符串中找到最后一个匹配之前就开始用同一个RegExp对象来检索另一个字符串,而放弃了原来的检索的时候就方法应该这样做)。这一特殊的行为使得你可以反复调用exec()遍历一个字符串中所有的正则表达式匹配。
代码如下 | 复制代码 |
/* Matched 'Java' at position 0 ; next search begins at 4 Matched 'Java' at position 28 ; next search begins at 32 */ var pattern = /Java/g; var text = "JavaScript is more fun than Java!"; var result; while((result = pattern.exec(text)) != null) { document.write("Matched '" + result[0] + "'" + " at position " + result.index + " ; next search begins at " + pattern.lastIndex + "<br/>"); }test() |
检索字符串中的指定值,返回值是 true 或 false:
这个方法就要简单的多了,也是我平时用的最多的一个方法,它的作用就是检查字符串中是否包含正则表达式的一个匹配。如果包含,则返回true,否则就返回false。
当一个全局正则表达式调用test()时,它的行为和方法exec()相同,即它从lastIndex指定的位置处开始检索特定的字符串,如果它发现了匹配,就将lastIndex设置为紧接在那个匹配之后的字符的位置。这样我们也可以使用方法test()来遍历字符串,就像用exec()方法一样。
代码如下 | 复制代码 |
/* next search begins at 4 next search begins at 32 */ var pattern = /Java/g; var text = "JavaScript is more fun than Java!"; var result; while(result = pattern.test(text)) { document.write(" next search begins at " + pattern.lastIndex + "<br/>"); } |
总结及唠叨:
这篇写的可能有些晕,大家对lastIndex可能不是很理解,这里再废话一下,String的方法search()、replace()和match()都没有像RegExp的exec()和test()那样使用RegExp对象的lastIndex属性(对,这个属性是RegExp也就是正则表达式对象的属性),事实上,String方法只是将lastIndex重置为0.并且大家一定要记住,在用exec()和test()时,只有匹配标志为g全局的时候才会有这个lastIndex属性的改变。
String对象支持四种利用正则表达式的方法,分别是search()、replace()、match()和split()。下面我们逐一进行讲解。
search()检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串:
search()方法应该是这四个方法中最简单的一个。其以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的子串,其返回-1。
代码如下 | 复制代码 |
//返回11,字符串第一个字符位置为0 var str = 'Welcome to xiaoxiaozi.com'; document.write(str.search(/xiaoxiaozi/)); //返回-1,因为我没有指定模式i var str = 'Welcome to xiaoxiaozi.com'; document.write(str.search(/XIAOXIAOZI/)); //返回11,因为我指定了模式为i var str = 'Welcome to xiaoxiaozi.com'; document.write(str.search(/XIAOXIAOZI/i)); |
刚才示例中参数我传的是正则表达式,如果search()的参数不是正则表达式,它首先将被传递给RegExp构造函数,转换成正则表达式。不过这里需要注意的一下是search()不支持全局检索,因为它忽略了正则表达式参数标志g。
replace() 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串:
方法replace()执行检索与替换操作。它的第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。它将检索调用它的字符串,根据指定的模式来匹配。如果正则表达式中设置了标志g,该方法将用替换字符串替换被检索的字符串中所有与模式匹配的子串,否则它只替换所发现的第一个与模式匹配的子串。
如果replace()的第一个参数是字符串,而不是正则表达式,该方法将直接检索那个字符串,而不是像search()那样用RegExp()构造函数将它转换成一个正则表达式。
//顺利被转换,输出为:
代码如下 | 复制代码 |
http://www.xiaoxiaozi.com say:"Welcome to http://www.xiaoxiaozi.com.com" var str = 'xiaoxiaozi say:"Welcome to XIAOXIAOZI.com"'; document.write(str.replace(/xiaoxiaozi/gi,'http://www.xiaoxiaozi.com')); |
我们曾经介绍过“正则表达式的分组”,其用括号括起来的子表达式是从左到右进行编号的,而且正则表达式会记住与每个子表达式匹配的广西。如果在替换字符串中出现了符号$(我就说老外都喜欢美元)加数字,那么replace()将用与指定的子表达式相匹配的广西来替换这两个字符。
代码如下 | 复制代码 |
//将双引号替换为``,并且双引号内的字符串保留xiaoxiaozi say:``Welcome to XIAOXIAOZI.com`` //给xiaoxiaozi.com中的xiaoxiaozi标红 |
刚才我们给出的示例中,replace()的第二个参数都是字符串,其实其第二个参数还可以是函数,该函数能够动态地计算替换字符串,并且其函数的参数顺序分别为:匹配整体正则的字符串,匹配模式1的字符串,匹配模式2的字符串…。
//将字符串的首字母大写
代码如下 | 复制代码 |
name = 'aaa bbb ccc'; uw=name.replace(/bw+b/g, function(word){ document.write (uw); |
match() 可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配:
match()方法是最常用的String方法,它唯一的参数就是一个正则表达式(或把它的参数传递给构造函数RegExp() 以转换成正则表达式),返回的是包含了匹配结果的数组。如果该正则表达式有标志g,该方法返回的数组包含的就是出现在字符串中的所有匹配。
代码如下 | 复制代码 |
//result=["1","2","3","4"] var str = '1a 2b 3c 4d'; var pattern = /d+/g; var result = str.match(pattern); for(i in result) { document.write(result[i]); } |
如果match()参数中没有设置g标志,其进行的就不是全局检索,但是仍然返回一个数组。在这种情况下,数组的第一个元素就是匹配的字符串,而余下的元素则是天上则表达工中用括号括起来的子表达式。其返回的数组为result,result[0]存放的是完整匹配,result[1]存放的是$1匹配的内容,和replace()第二个函数参数一致。
代码如下 | 复制代码 |
/* i is 0 http://www.xiaoxiaozi.com/index.php i is 1 http i is 2 www.xiaoxiaozi.com i is 3 index.php i is index 11 i is input my home is http://www.xiaoxiaozi.com/index.php */ var str = 'my home is http://www.xiaoxiaozi.com/index.php'; var pattern = /(w+)://([w.]+)/(S*)/; var result = str.match(pattern); for(i in result) { document.write("i is "+i+" "+result[i]+"<br/>"); } |
此例我们可以看出,其如果作用于一个非全局的正则表达式,那么match()返回的数组还包括另外两个属性——index和input,前者包含的是在字符串中匹配开始处的字符的位置,后者则是目标字符串的一个副本。
split() 用于把一个字符串分割成字符串数组:
String对象的最后一个有关正则表达式的方法是split(),此方法可以通过分隔符把调用它的字符串分隔为一个子串数组。其分隔符可以是字符,字符串,也可以是正则表达式。
代码如下 | 复制代码 |
/* 用一个空格分隔字符串 my home page is http://www.xiaoxiaozi.com */ var str = 'my home page is http://www.xiaoxiaozi.com'; var result = str.split(" "); for ( i in result) { document.write(result[i] + "<br/>"); } |
上例没有用正则表达式,可是如果我的字符串中有空多个格咋办?还有此方法得出的结果就不准确了啊,没事,咱不是有正则表达式呢吗?s匹配的就是任何Unicode空格符,咱怕啥?
代码如下 | 复制代码 |
/* 使用正则表达式s+一个或多个空格来分隔字符串 my home page is http://www.xiaoxiaozi.com */ var str = 'my home page is http://www.xiaoxiaozi.com'; var result = str.split(/s+/); for ( i in result) { document.write(result[i] + "<br/>"); } |
唠叨及总结:
呼,这一篇又写了好长,不过写到这也快完事了,哈。前面讲的正则表达式相当于钓鱼的工具,今天讲的这两篇(稍候还有一篇)讲的是钓鱼的方法,只有用适当的方法结合实用的工具才会钓上鱼
正则表达式 指定匹配的位置
正则表达式中有一些特殊的序列匹配的不是实际的字符,而是字符串中某些特殊的字符位置。下面我将继续用表格的方式列出这些指定匹配的位置的字符,并逐一进行举例描述。
正则表达式的锚字符:
字符 含义
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
b 匹配一个词语的边界。简而言之,就是位于字符w和W之间的位置,或位于字符w和字符串的开头或结尾之间的位置(注意:[b]匹配的是退格符)
B 匹配非词语边界的字符
(?=p) 正前向声明,要求接下来的字符都与模式p匹配,但是不包括匹配中的那些字符
(?!p) 反前向声明,要求接下来的字符不能与模式p匹配
举例描述:
1. ^ 匹配字符串的开头
这个应该很好理解,就好比说我要得到匹配”simaopig”的字符串,并且这个字符串得在前面,这里”simaopig”相当于我指定的规则我们可以用如下代码进行检查
代码如下 | 复制代码 |
var patt1=new RegExp("^simaopig"); |
// 与匹配规则相符,要求被匹配的内容在字符串的开始处,所以这里输入true
代码如下 | 复制代码 |
document.write(patt1.test("simaopig是小小子的昵称")); document.write("n"); |
// 与匹配规则不符,在字符串的开始处不是"simaopig",所以这里输出false
代码如下 | 复制代码 |
document.write(patt1.test("小小子的昵称是:simaopig")); |
2. $ 匹配字符串的结尾,这与前面的^相似,跳过不谈
3. b 匹配的是一个词语的边界
这个也应该挺好理解的,就比如说,我要匹配的东西必须是个独立的个体,例如我要匹配”simaopig”,但是”a simaopig”会匹配,因为这里的“simaopig”是一个独立的个体,独立的单词,而”simaopiga”就不是独立的,其作为其它字符串的一部分
代码如下 | 复制代码 |
var patt1=new RegExp("\bsimaopig\b"); // var patt1 = /bsimaopigb/; // simaopig是独立的单词,所以其输出true document.write(patt1.test("simaopig")); document.write("n"); // simaopig不是独立的单词,所以其输出false document.write(patt1.test("asimaopig ")); |
4. B 匹配的是一个词语不是边界的位置,可以理解为与b 相反,不多解释
5. ?= 与 ?!你可以理解为这样的操作:第一种,你需要里面有一个规则,比如说你是城管,你想要小贩卖的东西里面必须有黄瓜,可是其实你是不需要黄瓜的,但是你要求其必须得卖黄瓜,因为这是上面“龟”定的
第二种,你需要的是这样一个规则,你要求小贩不能卖柿子,因为柿子是自己要卖的东西,但是其实你想要的东西吧仍然是小贩所卖的其他品种
代码如下 | 复制代码 |
// 要求字符串里必须得以simaopig 开头,且其后面必须得有:,但是我真正匹配的内容是simaopig var patt1=new RegExp("^simaopig(?=\:)"); // 输出true document.write(patt1.test("simaopig: is a true man, it's true")); document.write("n"); // 输出false document.write(patt1.test("simaopig welcome come to xiaoxiaozi.com it's wrong")); |
总结及唠叨:
这玩意就是这样,用的时候来翻一下吧,因为我觉得自己是背不下来的,不过我之所以给出具体示例,是因为示例要比枯燥的定义更容易理解
补充:网页制作,js教程