正则表达式:RegExp对象
正则表达式描述一个字符模式的对象,或者说用某种模式去匹配一类字符串的一个公式。
1.创建
可以用RegExp构造函数和直接量两种方式。正则表达式直接量被包含在一对"/"中.
1 var partern1 = RegExp('\\d*'); 2 //等价于 3 var partern1 = /\d*/; 4 var partern2 = RegExp('^[1-9]*$'); 5 //等价于 6 var partern2 = /^[1-9]*$/;
在创建正则表达式时可以为其制定一个标志,来说明高级匹配模式的规则。
当使用RegExp创建表达式对象时,需要指定的标志作为第二个参数传入.
当使用直接量创建表达式对象时,直接在标识表达式的结束位置"/"写上标志.
标志 | 含义 |
i | 执行匹配时忽略大小写 |
g | 执行一个全局匹配,即找到所有匹配项, |
m | 多行匹配模式 |
标志可以自由搭配使用..........
var partern1 = RegExp('\\d*','g');//等价于var partern1 = /\d*/g;var partern2 = RegExp('^\\S$','i');//等价于var partern2 = /^\S$/i;var partern3 = RegExp('^\\w$', 'ig');//等价于var partern3 = /^\w$/ig;
2.语法规则:
1.正则表达式由字符直接量,元符号和各种转义序列组成。
字符直接量:匹配它本身。
除了字母字符和数字外,可以通过"\"开头的转义序列支持非字母字符。
直接量字符 | 匹配 |
字母或数字字符 | 自身 |
\o | NUL字符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\f | 换页符 |
\xnn | 由十六进制nn指定的拉丁字符 |
\uxxxx | 由十六进制xxxx指定的Unicode字符 |
\cx | 控制字符x |
在“[]”内放入单独的直接量组成字符类,一个字符类可以和它所包含的任何单个字符相匹配eg:[abc] 匹配:“a”,“b”,“c”
字符类 | 匹配 |
[...] | 括号内包含的任意字符 |
[^...] | 括号内不包含的任意字符 |
. | 除换行符和其他Unicode行中字符之外的其它字符 |
\w | 大小写字母,数字,下划线 |
\W | 非大小写字母,数字,下划线 |
\s | 空白字符 |
\S | 非空白字符 |
\d | 数字字符 |
\D | 非数字字符 |
eg:/\d\d/ : 两位数字。 /[bB]ug/ : bug,Bug. /a.b/ : abb, anb~ 等 。 /[^0-9]/ : 任何单个非数字。
上面给的是单位字符,下面给出多位字符
符号 | 含义 |
{m,n} | 匹配前一项最少m次,最多n次 |
{m,} | 匹配前一项最少m次 |
{m} | 匹配前一项m次 |
? | 匹配前一项0次或者1次 |
+ | 匹配前一项最少1次 =>{1,} |
* | 匹配前一项0次或多次,=>{0,} |
eg: /\d{1,3}/ : 匹配1~3位数字。 /a{3}/ : 匹配aaa. /a?/ : 匹配‘’和‘a'
注意:在重复匹配时正则会尽可能多的匹配更多的字符:贪婪匹配。如果在表达式后面加上元符号“?”就会进行费贪婪匹配,匹配尽可能少的字符。
eg: /a+/匹配’aaaab' 时会匹配前四位a , /a+?/则只会匹配第一位a
正则表达式还可以指定选择项,为表达式分组和引用前面子表达式所匹配的字符。
符号 | 含义 |
| | 选择,匹配符号左边的子表达式或者右边的子表达式。 |
(...) | 组合,将几个项目组合为一个单元,这个单元可以被重复字符所使用,还可以被引用。 |
(?:...) | 只组合,为一个单元,但不能被引用 |
\n | n是一个数字,表示:表达式中第n个可以被引用的组合,从左到右按书写顺序排序。 \n 匹配与其所引用的分组匹配字符一样的字符 |
eg:/a|b/ : 'a','b' . /(a|b)B\1/ :aBa,bBb . /(?:m+)(a|b)B\1/ : \1匹配a|b而不是m+
正则表达式还有一些字符和转义序列匹配的是字符串中的特定位置 : 锚字符
字符 | 含义 |
^ | 匹配字符串的开头。在多行匹配模式中,匹配一行的开头。 |
$ | 匹配字符串的结尾。在多行匹配模式中,匹配一行的结尾 |
\b | 参考:http://www.w3school.com.cn/js/jsref_regexp_begin.asp 匹配一个词语(单词)的边界 \b 元字符匹配单词边界。 在单词边界匹配的位置,单词字符后面或前面不与另一个单词字符直接相邻。请注意,匹配的单词边界并不包含在匹配中。换句话说,匹配的单词边界的长度为零。(不要与 [\b] 混淆。) 如果未找到匹配,则返回 null 提示:\b 元字符通常用于查找位于单词的开头或结尾的匹配。 |
\B | 匹配所有非词语(单词)边界的字符 |
(?:p) | 正前向匹配,要求接下来的字符与模式p匹配,但匹配的结果不包含p匹配的字符。 |
(?!p) | 反前向匹配,要求接下来的字符不与模式p匹配 |
eg: /^Bugs/ : 匹配Bugs Bug,不匹配Bug Bug . /s$/ : 匹配 Bug Bugs 不匹配Bugs Bug .
/^Bugs Bug$/ : 匹配Bugs Bug,不匹配Bug Bug .
/\bm/ 匹配 "moon" 中的 'm';
/oo\b/ 不匹配 "moon" 中的 'oo',因为 'oo' 后面的 'n' 是一个单词字符;
/oon\b/ 匹配 "moon" 中的 'oon',因为 'oon' 位于字符串的末端,后面没有单词字符;
/\w\b\w/ 不匹配任何字符,因为单词字符之后绝不会同时紧跟着非单词字符和单词字符。
<script type="text/javascript">var str = "Bugs Bug";var patt1 = /\bBug/g;document.write(str.match(patt1));//Bug,Bug
</script>
/Bugs(?: Bug)/ : 匹配Bugs Bug 不匹配BugsBug
注意:如果想匹配元符号或者具有特殊含义的符号时,只需要在相应的字符前面加上转义符反斜线“\”即可。
3. 正则表达式的属性
source :是一个只读的字符串,存放正则表达式的文本。
<script type="text/javascript">var str = "Bugs Bug";var reg = new RegExp('^(Bugs Bug){0,}$', 'igm');var test = reg.source;alert(test); //^(Bugs Bug){0,}$ </script>
global : 是一个只读的布尔属性,表示:正则表达式是否启用了全局匹配模式。
<script type="text/javascript">var str = "Bugs Bug";var reg = new RegExp('^(Bugs Bug){0,}$', 'igm');var reg1 = new RegExp('^(Bugs Bug){0,}$', 'm');alert(reg1.global);//falsealert(reg.global);//true</script>
ignoreCase : 同global类似,只读的布尔值,表示正则表达式是否启用了忽略大小写的模式。
multiline : 只读属性,表示正则表达式是否启用了多行匹配的模式。
lastIndex : 是一个可读可写的整数,记录了在全局匹配模式下,在字符串中下一次开始匹配的位置,
4.用于匹配模式的String方法
replace方法 :
var str = "Bugs&Bug"; var reg3 = new RegExp('&', 'g');alert(str.replace(reg3,' '));//Bugs Bug
search方法 : 以正则表达式为参数,返回第一个与之匹配的子字符的开始位置,如果没有任何子字符与之匹配返回-1.
<script type="text/javascript">var str = "I Love Bugs Bug";var reg = new RegExp('B.*s', 'igm');//匹配Bugsalert(str.search(reg)); //7alert(str.search(/.(?:Bug)/));//6 //匹配Bugs前面的空格</script>
注意:如果参数不是正则表达式,则参数会被传递给RegExp的构造函数,变为正则表达式,同时,search并不支持全局匹配模式,总是返回找到的第一个子字符的位置.
在replace方法的第二个参数中,可以使用符号“$”加数字来引用这些分组所匹配的内容。
<script type="text/javascript">var str = 'my name is?Bugs Bug';var regstr =str.replace(/^.*\?([a-zA-Z]+.*)+$/i, 'my name is:"$1"');alert(regstr); //my name is:"Bugs Bug"</script>
方法match接受一个正则表达式作为参数(如果不是正则表达式,会转换成正则表达式) 返回一个包含匹配结果的数组,数组的第一个元素是匹配的子字符串,
从第二个元素开始,是正则表达式的分组所匹配的内容,如果正则表达式被设置成了全局匹配模式,则返回的数组就是字符串中所有匹配的子字符串,
<script type="text/javascript">function test() {var str = "my name is?Bugs Bug";var strreg = str.match(/^.*\?(([a-rA-Rt-zT-Z]*).*([a-zA-z]*))$/);alert(strreg); //my name is?Bugs Bug,Bugs Bug,Bug,var strreg2 = str.match(/^.*\?([a-rA-Rt-zT-Z]*).*([a-zA-z])*$/g);alert(strreg2); //my name is?Bugs Bug }test();</script>
如果match作用于一个非全局模式的正则表达式,则返回的数组会有两个额外的
属性 :index:包含所匹配的字符串在源字符串中的位置,
input:保存了源字符串的一个副本。
alert(strreg.index);//0alert(strreg.input); //my name is?Bugs Bug }test();
split方法,有一个接受正则表达式的参数
<script type="text/javascript">function test() {var str = "my|name\\is?Bugs Bug";alert(str.split(/\||\\|\?| /));//my,name,is,Bugs,Bug}test();</script>
RegExp定义了两个用于模式匹配的方法,他们的行为和前面介绍的String方法,类似。第一个是exec方法,和match方法相似,只是它接受一个字符串的参数,在此字符串中进行匹配查找,返回一个数组,与match方法不同的是:无论正则表达式是否开启了全局匹配模式,exec方法每次只匹配一个结果,返回数组的第一个元素是匹配的子字符串,从第二个元素开始是正则表达式中各个分组所匹配的内容,
只是当正则表达式开启了全局匹配模式时,每次成功匹配后,正则表达式的lastIndex属性都会被改写以标识此次匹配的子字符串的位置,在下一次执行exec方法进行匹配时,会从lastIndex属性标识的位置开始查找,当没有任何匹配时,lastindex属性会被重置为0,并返回null,这个特性使程序员反复匹配一个字符串从而得到所有匹配的子字符串的所有信息。
<script type="text/javascript">function test() {var str = "my|name\\is?Bugs Bug";var reg = /(Bugs) (Bug)/g;var a;while ((a = reg.exec(str)) != null) {document.write(a.join(' ') + '<br/>'); //Bugs Bug Bugs Bug }var str = "a=1&b=2+c=3|d=4@e=5%f=6";var reg = /([a-z])=([0-9])/g;var a;while ((a = reg.exec(str)) != null) {document.write(a.join(' ') + '<br/>');/* a=1 a 1b=2 b 2c=3 c 3d=4 d 4e=5 e 5f=6 f 6*/}}test();</script>
另一个方法是test,接受一个字符串作为参数,然后进行匹配检测,如果字符串能够进行匹配,则返回true,否则false,
<script type="text/javascript">function test() { var reg = /([A-Za-z])/;alert(reg.test("Bugs Bug"));//truealert(reg.test("123"));//false }test();</script>
常用的正则表达式:(未验证)
中文字符 | [\u4e00-\u9fa5] |
双字节字符(包括汉字) | [^\x00-\xff] |
E-mail地址 | /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/i |
HTML标记 | /<(.*)>.*<\/\1>|<(.*)\/>/ |
URL 地址 | /^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/i |
字符串首尾的空格 | /(^\s*)|(\s*$)/ |
颜色代码 | /\#[a-fA-F0-9]{6}/ |
身份证号码 | /^\d{15}(\d{2}[xX0-9])?$/ |
电话号码 | /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/ |
整数 | /^(\+|\-)?[1-9]\d*$/ |
浮点数 | /^(\+|\-)?(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$/ |