JavaScript 实现基础--正则表达式--简单模式--
2009-08-25 15:41
786 查看
正则表达式除了用来匹配一些特殊字符外,还有许多其他的作用。Metacharacters,character classes和quantifiers都是正则表达式语法中的重要组成部分,可以用来实现更强大的功能。
Metacharacters
正则表达式的Metacharacters主要包括:
([{/^$|)?*+.
当需要使用这些符号的时候,需要在前面加上一个反斜杠"/",例如:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //?/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = new RegExp("//?");
一个字符的表示可以使用它的文字符号,也可以使用ASCII码或Unicode码来代码它。例如,当一个字符使用ASCII码表示的时候,我们需要在一个两位十六进制的编码前加上"/x"。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var name = "apple";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var regName = //x61/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(regName.test(name)); //输出"true"
当然,使用十进制来表示字母a。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //141/;
使用Unicode来表示一个字符,需要四位十六进制的编码,例如/u0062代表b。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var s = "big";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //u0062/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(s)); //输出为"true"
下面一段代码可以到达同样的效果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var s = "big";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = new RegExp("//u0062");
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(s)); //输出为"true"
另外,有一些预定义好的特殊字符,用来表示特殊的含义。如:“/t,/n,/r,/f,/a,/e,/cX,/b,/v,/0”。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
//将用户输入的新一行的所有字符都删除
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = strWithNewLines.replace(//n/g, "");
Character classes
Character classer代表着需要匹配的一组字符,将需要匹配的字符放在一对中括号里,正则表达式将能有效的识别第一个字符,第二个字符,等等。
Simple classes
如果需要同时匹配"pig"和"big",可以使用simple character class来实现:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = "pig, big";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = /[pb]ig/gi;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var arr = str.match(reg);
此时,arr中的数据包括"pig"和"big"。当然,使用ASCII或Unicode来表示p或b同样可行。
Negation classes
有时我们需要匹配除了少数几个字符外的所有字符,在这种情况下,我们可以使用negation class来进行匹配。例如,匹配除了a和b之外所有的字符,可以表示为[^ab]。在上一个例子中,将reg表示为/[^p]ig/gi,则结果中将过滤掉pig。
Range classes
顾名思义,range class就是用来指定某个范围的匹配字符,例如从a到z可以表示为[a-z],从1到10可以表示为[1-10]。如果将range class指定的字符排除在外,可以使用[^1-10],表示除了1到10范围外的所有字符。
Combination classes
举一个例子就清楚了,现在需要匹配从1到10,从a到g,并且加上新一行的所有字符,可以表示为[1-10a-g/n]。注意,在[]里不允许再嵌套[]。
Predefined classes
因为有许多样式都不停在重复使用,因此一组预定义好的character classes可以用来简化一些比较复杂的类型。具体的可以参考相关资料,下面举个简单的例子:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = "8743 apple";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = /[0-9][0-9][0-9]/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(str)); //输出为"true"
使用predefined class可以写成:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = "8743 apple";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //d/d/d/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(str)); //输出为"true"
Quantifiers
Quantifiers能够指定某种匹配方式需要进行多少次,包括指定确定的次数,或不确定的次数如至少多少次。
Simple quantifiers
下面列表中,指定了某种模式需要重复进行的次数,部分符号和闭包的意义一样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/19/db780ccf6c9a48906095920499fbac0d.gif)
例如var reg = /b?read/就可以表示bread或read。
三种正则表达式的quantifiers
Greedy quantifier: 对一个目标串进行匹配搜索,当在目标串中没有相匹配的字符串时,就删去目标串的最后一个字符,再次进行匹配,如果没有发现则再删去最后一个字符,依此类推,最后的结果要么已经将字符匹配上,要么目标串已经为空。
Reluctant quantifier: 和greedy quantifier搜索风格相反。Reluctant quantifier从目标串的第一个字符开始对目标串进行搜索,当没有匹配时,给目标串加上一个字符,再次进行搜索,依此类推,直到在目标串上匹配成功,或整个目标串都被搜索但仍然没有完成匹配。
Possessive quantifier: 直接对整个目标串进行匹配,要么匹配上,要么匹配失败,它只进行一次匹配。
那么如何判断这三种不同的quantifiers呢?主要就是根据问号(?)星号(*)和加号(+)的组合来判断的,如下表所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/19/10c5c1290942740f7a0fc4c4e8a03883.gif)
需要注意的是,possessive quantifier在目前主流的浏览器中都不被支持,IE和Opera在碰到possessive quantifier时将会抛出异常,Mozilla虽然不会发生错误,但会将它作为greedy quantifier来对待。
Metacharacters
正则表达式的Metacharacters主要包括:
([{/^$|)?*+.
当需要使用这些符号的时候,需要在前面加上一个反斜杠"/",例如:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //?/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = new RegExp("//?");
一个字符的表示可以使用它的文字符号,也可以使用ASCII码或Unicode码来代码它。例如,当一个字符使用ASCII码表示的时候,我们需要在一个两位十六进制的编码前加上"/x"。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var name = "apple";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var regName = //x61/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(regName.test(name)); //输出"true"
当然,使用十进制来表示字母a。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //141/;
使用Unicode来表示一个字符,需要四位十六进制的编码,例如/u0062代表b。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var s = "big";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //u0062/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(s)); //输出为"true"
下面一段代码可以到达同样的效果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var s = "big";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = new RegExp("//u0062");
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(s)); //输出为"true"
另外,有一些预定义好的特殊字符,用来表示特殊的含义。如:“/t,/n,/r,/f,/a,/e,/cX,/b,/v,/0”。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
//将用户输入的新一行的所有字符都删除
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = strWithNewLines.replace(//n/g, "");
Character classes
Character classer代表着需要匹配的一组字符,将需要匹配的字符放在一对中括号里,正则表达式将能有效的识别第一个字符,第二个字符,等等。
Simple classes
如果需要同时匹配"pig"和"big",可以使用simple character class来实现:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = "pig, big";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = /[pb]ig/gi;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var arr = str.match(reg);
此时,arr中的数据包括"pig"和"big"。当然,使用ASCII或Unicode来表示p或b同样可行。
Negation classes
有时我们需要匹配除了少数几个字符外的所有字符,在这种情况下,我们可以使用negation class来进行匹配。例如,匹配除了a和b之外所有的字符,可以表示为[^ab]。在上一个例子中,将reg表示为/[^p]ig/gi,则结果中将过滤掉pig。
Range classes
顾名思义,range class就是用来指定某个范围的匹配字符,例如从a到z可以表示为[a-z],从1到10可以表示为[1-10]。如果将range class指定的字符排除在外,可以使用[^1-10],表示除了1到10范围外的所有字符。
Combination classes
举一个例子就清楚了,现在需要匹配从1到10,从a到g,并且加上新一行的所有字符,可以表示为[1-10a-g/n]。注意,在[]里不允许再嵌套[]。
Predefined classes
因为有许多样式都不停在重复使用,因此一组预定义好的character classes可以用来简化一些比较复杂的类型。具体的可以参考相关资料,下面举个简单的例子:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = "8743 apple";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = /[0-9][0-9][0-9]/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(str)); //输出为"true"
使用predefined class可以写成:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var str = "8743 apple";
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
var reg = //d/d/d/;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
alert(reg.test(str)); //输出为"true"
Quantifiers
Quantifiers能够指定某种匹配方式需要进行多少次,包括指定确定的次数,或不确定的次数如至少多少次。
Simple quantifiers
下面列表中,指定了某种模式需要重复进行的次数,部分符号和闭包的意义一样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/19/db780ccf6c9a48906095920499fbac0d.gif)
例如var reg = /b?read/就可以表示bread或read。
三种正则表达式的quantifiers
Greedy quantifier: 对一个目标串进行匹配搜索,当在目标串中没有相匹配的字符串时,就删去目标串的最后一个字符,再次进行匹配,如果没有发现则再删去最后一个字符,依此类推,最后的结果要么已经将字符匹配上,要么目标串已经为空。
Reluctant quantifier: 和greedy quantifier搜索风格相反。Reluctant quantifier从目标串的第一个字符开始对目标串进行搜索,当没有匹配时,给目标串加上一个字符,再次进行搜索,依此类推,直到在目标串上匹配成功,或整个目标串都被搜索但仍然没有完成匹配。
Possessive quantifier: 直接对整个目标串进行匹配,要么匹配上,要么匹配失败,它只进行一次匹配。
那么如何判断这三种不同的quantifiers呢?主要就是根据问号(?)星号(*)和加号(+)的组合来判断的,如下表所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/19/10c5c1290942740f7a0fc4c4e8a03883.gif)
需要注意的是,possessive quantifier在目前主流的浏览器中都不被支持,IE和Opera在碰到possessive quantifier时将会抛出异常,Mozilla虽然不会发生错误,但会将它作为greedy quantifier来对待。
相关文章推荐
- JavaScript 实现基础 正则表达式
- JavaScript之基础-10 JavaScript 正则表达式(概述、定义正则、RegExp对象、用于模式匹配的String方法)
- JavaScript基础插曲—元素样式,正则表达式,全局模式,提取数组
- [Javascript]正则表达式--JavaScript 实现基础
- JavaScript 实现基础--正则表达式--
- JavaScript 实现基础 正则表达式
- ASP.NET中服务器控件Button调用javascript代码运用正则表达式验证TextBox中输入的是否为正整数或正小数,符合要求则继续运行服务器端代码功能的实现
- JavaScript通过正则表达式实现表单验证电话号码
- JAVASCRIPT 正则表达式学习-->基础与零宽断言(转自司徒正美)
- javascript 正则表达式-贪婪模式与懒惰模式
- javascript中正则表达式的基础语法
- 用原生javascript实现最简单的发布者-订阅者模式
- 正则表达式匹配也可以简单快速(下:实现部分)
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
- javascript基础-实现简单功能
- 简单-正则表达式贪婪与非贪婪模式
- javascript 正则表达式入门基础—由浅入深
- javascript下利用数组缓存正则表达式的实现方法
- javascript中使用正则表达式实现删除字符串中的前后空格
- javascript基础-实现简单功能