javaScript 正则表达式总结
1、定义
在javascript我们可以通过内建的类来定义一个正则表达式。
var reName = new RegExp("nowamagic");
实际上RegExp类的构造函数可以接受两个参数,除了本身需要匹配的模式字符串外,还可以定义指定额外处理方式的第二个参数。
var reName = new RegExp("nowamagic","i");//忽略大小写
我很好奇输出reName会得到什么结果呢?于是:
document.write(reName);
得到结果:/nowamagic/i,于是我们得到javascript中正则表达式的第二种定义方法(perl风格):
var reName = /nowamagic/;
那第二个参数呢?当然,同样可以为其指定第二个参数:
var reName = /nowamagic/i;
这两种定义方式都是可行的,完全可以根据个人习惯进行选择。就像可以使用var s = new String(“for a simple life”);定义字符串的同时还可以使用var s = “for a simple life”;来定义是完全相同的。建议使用perl风格的写法,除了简洁外,还省去了使用RegExp构造函数定义时需要对“\”转义的麻烦。
如果要匹配字符“\”,perl风格的写法是:
var res = /\\/;
而构造函数的写法则需要对两个“\”都进行转义:
var res = new RegExp("\\\\");
感觉上是不是就麻烦了很多?
记住,在一个完整的正则表达式中“\”后面总是跟着另外一个字符。
2、元字符
在正则表达式中有一些特殊的字符符号我们是不能直接使用的,必须对其进行转义后才能使用。如“\”,因为这些字符在正则表达式中有特殊的语法含义,这类字符被称为元字符,正则表达式中的元字符有:.,\,/,*,?,+,[,(,),],{,},^,$,|
可能不太好记忆,当无法确定某个字符是否是元字符的时候就勇敢的对其进行转义是没有错的,对不是元字符的字符进行转义是不
会出什么问题的,但是如果不对元字符转义就会有意想不到的错误产生了。
3、字符类
将单独的直接量字符放进中括号[ ]内就可以组合成字符类.一个字符类和它所包含的任何一个字符都匹配,所以正则表达式 / [abc] / 和字母 "a" ,"b" ,"c" 中的任何一个都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字
符。定义否定字符类时,要将一个 ^ 符号作为从左中括号算起的第一个字符.正则表达式的集合是 / [^a-zA-z0-9] / 。
特殊字符
var reNum = /\d/;
$ 用来匹配字符串结尾
\d 任何一个数字字符,等价于[0-9]
\D 任何一个非数字字符,等价于[^0-9]
\w 任何一个字母数字或下划线字符,等价于[a-zA-Z_]
\W 任何一个非字母数字和下划线字符,等价于[^a-zA-Z_]
\s 任何一个空白字符,包括换页符、换行符、回车符、制表符和垂直制表符,等价于[\f\n\r\t\v]
\S 任何一个非空白字符,等价于[^\f\n\r\t\v] 换行和回车以外的任何单个字符,等价于[^\n\r]
相同字母大小写总是进行取非操作的。
4、重复
var email = "mymail@mail.com";
document.write(reMail.test(email));//true
“+”表示字符出现一次或多次,至少出现一次。这个正则表达式其实并不能匹配所有合法的email地址,后面我们继续完善。
除了“+”可以指定至少匹配一次外,还有很多其他的可以指定匹配次数的方式。
? 出现零次或一次,最多一次
* 出现任意次(零次、一次、多次)
+ 出现一次或多次,至少一次
{n} 能且只能出现n次
{n,m} 至少出现n次,最多出现m次
www.gogle.com,www.google.com,www.gooogle.com这三个网址都能正确地打开google的首页,于是就可以用{n,m}匹配其中的1个,2个或3个字母”o”。
var gogle = "www.gogle.com";
var google = "www.google.com";
var gooogle = "www.gooogle.com";
var reGoogle = /w{3}\.go{1,3}gle\.com/i;
document.write(reGoogle.test(gogle));//true
document.write(reGoogle.test(google));//true
document.write(reGoogle.test(gooogle));//true
在上面的正则表达式中,我们使用了{3}来制定字符“w”能且只
能出现3次,用{1,3}来制定字母“o”可以出现1到3次。
5、选择,分组和引用
正则表达式的语法还包括指定选择项,对子表达式分组和引用前一子表达式的特殊字符。字符| 用于分隔供选择的字符。例如:/ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",又或者 "ef"。 /\d{3}|[a-z]{4}/ 匹配的是要么是一个三位数,要么是四个小写字母。在正则表达式中括号具有几种作用。它的主要作用是把单独的项目分组成子表达式,以便可以像处理一个独立的单元那种用 *、+或? 来处理那些项目。例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以没有。/(ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复。在正则表达式中,括号的第二个用途是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配的部分,例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/。但是由于假定我们真正关心的是每个匹配尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (\d+)/) ,我们就可以从所检索到的任何匹配中抽取数字了。
带括号的子表达式的另一个用途是,允许我们在同一正则表达式的后面引用前面的子表达式。这是通过在字符串 / 后加一位或多位数字来实现的。数字指的是带括号的子表达式在正则表达式中的位置。例如:/1 引用的是第一个带括号的子表达式。/3 引用的是第三个代括号的子表达式。注意,由于子表达式可以嵌套在其它子表达式中,所以它的位置是被计数的左括号的位置,例如:
在下面的正则表达式被指定为 /2:
/([Jj]ava([Ss]cript)) \sis \ (fun\w*) /
对正则表达式中前一子表达式的引用所指定的并不是那个子表达式的模式,而是与那个模式相匹配的文本。这样,引用就不只是帮助你输入正则表达式的重复部分的快捷方式了,它还实施了一条规约,那就是一个字符串各个分离的部分包含的是完全相同的字符.例如:下面的正则表达式匹配的就是位于单引号或双引号之内的所有字符。但是,它要求开始和结束的引号匹配(例如两个都是双引号或者都是单引号):
/[' "] [^ ' "]*[' "]/
如果要求开始和结束的引号匹配,我们可以使用如下的引用:
/( [' "] ) [^ ' "] * /1/
/1匹配的是第一个代括号的子表达式所匹配的模式。在这个例子中,它实施了一种规约定,那就是开始的引号必须和结束的引号相匹配。注意,如果反斜杠后跟随的数字比带括号的子表达式数多,那么它就会被解析为一个十进制的转义序列,而不是一个引用。你可以坚持使用完整的三个字符来表示转义序列,这们就可以避免混淆了。例如,
使用 /044,而不是/44。
下面是正则表达式的选择、分组和引用字符:
字符 含义
| 选择,匹配的要么是该符号左边的子表达式,要么它右边的子表达式
(...) 分组,将几个项目分为一个单元。
这个单元可由 *、+、?和|等符号使用,
而且还可以记住和这个组匹配的字符以供此后引用使用
/n 和第n个分组所匹配的字符相匹配。
分组是括号中的子表达式(可能是嵌套的)。
分组号是从左到右计数的左括号数