在上一篇文章中我们介绍了"什么是正则表达式",本文将继续了解:“正则表达式的应用示例”。
圆点(.)元字符
在正则表达式中,圆点(.)元字符代表任何字符(除了回车换行符之外)。通常使用圆点字符来表示占据一个位置,进而表达圆点两侧符号之间的距离关系。例如,正则表达式/a..b/
的含义是:匹配以字符a开头,后面跟两个任意字符,然后是字符b的子串。正则表达式/../
表示匹配任何由两个字符组成的子串。
下面的例子搜索字符串中是否包含有“java”子串,正则表达式为:/j..a/gi
。你可以在文本框中输入字符串来进行测试。
var myString = $("#textarea-1").val(); var regex = /j..a/gi; if(regex.test(myString)){ alert("在字符串“"+myString+"”中找到了正则表达式/j..a/gi的匹配。") }else{ alert("没有找到匹配的模式。"); }
字符类匹配
字符类表示一组字符的一个字符,例如。[xyz]
表示匹配x,y,z这个3个字母中的任何一个,[北上广]
匹配汉字“北”、“上”、“广”中的任何一个,[0-9]
匹配0-9的任何一个数字。当字符类以脱字符^
开头时,表示匹配不在这组字符中的任何字符。例如:[^0-9]
表示匹配不是0-9的任何字符,[^a-zA-z]
表示匹配不是字母的任何字符。
检测字符串中是否包含数字
下面的例子检测字符串中是否包含有数字。
var myString = $("#textarea-2").val(); var regex = /[0-9]/; if(regex.test(myString)){ alert("在字符串“"+myString+"”中找到了数字。") }else{ alert("在字符串中没有找到数字。"); }
检测字符串中是否包含非字母的字符
下面的例子检测字符串中是否包含有非字母的字符。
var myString = $("#textarea-3").val(); var regex = /[^a-zA-Z]/; if(regex.test(myString)){ alert("在字符串“"+myString+"”中找到了非字母的字符。") }else{ alert("在字符串中没有找到非字母的字符。"); }
检测字符串中是否包指定个数的数字
下面的例子检测字符串中是否包含有连续4个数字的子串。
var myString = $("#textarea-4").val(); var regex = /\d\d\d\d/; if(regex.test(myString)){ alert("在字符串“"+myString+"”中找到了4个连续数字的子串。") }else{ alert("在字符串中没有找到4个连续数字的子串。"); }
元符号\s、\S、\w、\W匹配演示
这个例子中,正则表达式的匹配模式为一个单词字符开始,后面跟一个空白字符,然后又是一个单词字符,接着是一个非单词字符,最后是一个非空白字符。你可以试一试:XY2 Z!?
var myString = $("#textarea-4").val(); var regex = /\w\s\w\W\S/; if(regex.test(myString)){ alert("在字符串“"+myString+"”中找到了正则表达式/\w\s\w\W\S/的匹配") }else{ alert("在字符串中没有找到正则表达式的匹配。"); }
限定符元字符的使用
前面的元字符示例中都是只匹配一个字符,如果我们想匹配多个字符时,可以使用表示重复次数的限定元字符。限定符元字符可以指定匹配的次数,也可以指定匹配次数的范围,还可以指定多少次以上的匹配。
最长匹配原则(贪婪匹配原则)
默认情况下,JavaScript的正则表达式引擎使用贪婪匹配原则来搜索重复元字符匹配的子串,也就是说,从字符串左边的位置开始,尽可能的向右边匹配,只要满足指定的正则表达式就匹配。例如:
var str = "ab12345678901234567890cd"; var regex = /ab[0-9]*/;
如果使用字符“X”替换上面的正则表达式匹配的子串,得到的结果是:
var myString = str.replace(/ab[0-9]*/,"X"); alert(myString); //输出Xcd
替换后得到的结果是Xcd
,而不是X2345678901234567890cd
。
元字符*
是一个最长匹配(贪婪匹配)的元字符,它匹配任意多个字符,并且总是尽可能多的匹配字符。在上面的例子中,星号作用在[0-9]
上,表示匹配任意个数的数字。在遇到非数字字符之前,元字符*
一直匹配,直到遇到字符c
为止。所以,上面的正则表达式匹配以ab开头,后面跟任意多个数字的子串,使用字符串对象的replace()
方法替换后,将整个匹配的子串替换为X,所以替换后的字符串为Xcd。
贪婪匹配特性(*元字符)
var myString = "Hello world!"; var regex = /[A-Z][a-z]*\s/; if(regex.test(myString)){ alert("在字符串“"+myString+"”中找到了正则表达式/[A-Z][a-z]*\\\s/的匹配"); var arr = regex.exec(myString); $("#output-1").text("匹配的子串为: "+arr[0]); }else{ alert("在字符串中没有找到正则表达式的匹配。"); }
这个例子要求匹配字符串中包含以大写字母开头,后面跟任意多个小写字母,然后是一个空白字符的子串。如果找到,则将匹配的子串在页面中输出。
你可以测试字符串“Hello world!”和字符串“HELLO WORLD”的区别。第一个字符串得到的结果是“Hello”,而第二个字符串得到的结果是“H”,*
匹配0个字符。
贪婪匹配特性(+元字符)
元字符+
匹配一个或多个字符,它与*
不同之处在于:*
可以匹配0个字符,而+
至少要匹配一个字符。
var myString = "abcccccd"; var regex = /bc+d/; var result= regex.test(myString); if(result){ var arr = regex.exec(myString); alert(arr[0]); }
执行上面的代码,得到的结果是:bcccccd。
贪婪匹配特性({n}元字符)
元字符{n}
表示精确匹配n次某个字符,这里的n是一个具体的数字。
var myString = "abcccccdbcd"; var regex = /bc{5}d/; var result= regex.test(myString); if(result){ var arr = regex.exec(myString); alert(arr[0]); }
执行上面的代码,得到的结果为:bcccccd,而后面的bcd不会被匹配。
贪婪匹配特性(x{n,m}元字符)
元字符x{n,}
表示至少匹配n次,它比元字符x{n}
只多了一个逗号。元字符x{n,m}
表示至少匹配n次,但是至多匹配m次。当需要指定匹配次数大于1的时候,使用x{n,}
,当需要精确匹配的次数时,使用x{n}
,当需要指定匹配次数在一个范围的时候,使用x{n,m}
。
var myString = "(010)13507738888"; var regex = /\d{7,11}/; var result= regex.test(myString); if(result){ var arr = regex.exec(myString); alert(arr[0]); }
上面的代码匹配7-11个连续的数字,得到的结果为:13507738888。
关闭元字符的贪婪匹配特性
如果我们需要的匹配结果不是最长匹配,而是首次匹配,该如何操作呢?其实方法非常简单:我们只需要在贪婪匹配修饰符的后面添加一个问号(?)即可。这个问号关闭了元字符的贪婪匹配特性,它表示匹配动作在第一次匹配后结束,而不是在最后一次匹配时结束。
我们来看下面的例子,第一个例子中使用了贪婪匹配特性,而第二个例子中关闭了贪婪匹配特性,看看它们之间的区别。
/** 贪婪匹配 **/ var myString = "abcdefghijklmnopqrstuvwxyz12345"; var regex = /[a-z]+/; myString = myString.replace(regex,"YYYY"); alert("替换后的字符串为: "+myString);
正则表达式/[a-z]+/
表示匹配一个或多个小写字母,并且是进行贪婪匹配,所以得到的结果为:YYYY12345。
/** 关闭贪婪匹配 **/ var myString = "abcdefghijklmnopqrstuvwxyz12345"; var regex = /[a-z]+?/; myString = myString.replace(regex,"YYYY"); alert("替换后的字符串为: "+myString);
这一次,我们使用的正则表达式是/[a-z]+?/
,它表示匹配一个或多个小写字母,但不进行贪婪匹配,在找到第一个小写字母之后,就停止了进一步的匹配。所以得到的结果为:YYYYbcdefghijklmnopqrstuvwxyz12345
定位元字符的使用
在实际应用中,除了需要在字符串的任意位置找到匹配的子串外,很多时候还需要在指定的位置查找是否存在匹配的子串。例如,我们可能需要查找在行首是否出现某个单词,在行尾是否出现了某个子串等等。
JavaScript中提供了一组元字符来完成这些功能,这样的元字符称为定位元字符,它匹配的是字符串出现的位置而不是字符串本身。
行首匹配(^元字符)
^
元字符代表行首,而不是具体的字符。
var myString = "JavaScript和正则表达式"; var regex = /^JavaScript/; if(regex.test(myString)){ alert("匹配成功"); }else{ alert("匹配失败"); }
上面的正则表达式匹配以“JavaScript”开头的字符串,如果不是以“JavaScript”开头,哪怕是前面多一个空格符,匹配也不会成功。
行尾匹配($元字符)
$
元字符表示行尾匹配,它的用法于^
元字符相同。
var myString = "JavaScript和正则表达式"; var regex = /正则表达式$/; if(regex.test(myString)){ alert("匹配成功"); }else{ alert("匹配失败"); }
如果上面的字符串的结尾是一个标点、空白符或其它字符,那么匹配失败。
单词匹配(\b元字符)
某些时候我们想要在字符串中查找一个完整的单词,而不是包含在某个单词中的部分子串。例如:我们想要查找的是单词man,而不是单词superman中的man。此时,我们就可以使用元字符\b
来指定这种类型的匹配。例如下面的例子查找字符串中是否有单词man。
var myString = "A man without money is no man at all."; var regex = /\bman\b/; if(regex.test(myString)){ alert("在字符串中找到匹配的模式/\\bman\\b/的子串。"); }else{ alert(在字符串中未找到匹配的子串。); }
如果将字符串中的man该为superman,那么将匹配失败。
网友评论文明上网理性发言 已有0人参与
发表评论: