RegExp 是正则表达式的缩写;当您检索某个文本时,可以使用一种模式来描述要检索的内容;正则表达式就是这种模式。简单的模式可以是一个单独的字符,更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等;您可以规定字符串中的检索位置,以及要检索的字符类型,等等。
正则表达式有哪些用处
1.正则表达式可以测试字符串的某个模式;例如:可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证
2.正则表达式可以实现文本替换;可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字
3.正则表达式可以根据模式匹配从字符串中提取一个子字符串;可以用来在文本或输入字段中查找特定文字
正则表达式基本语法
一个正则表达式就是由普通字符(例如字符 a 到 z)和特殊字符(称为元字符)组成的文字模式;该模式描述在查找文字主体时待匹配的一个或多个字符串;正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配
如何创建正则表达式
使用构造函数定义正则表达式,注意大小写,否则就会不起作用;由于构造函数的参数是一个字符串,也可以是两个斜杠的方式定义,遇到一些特殊字符就需要使用进行转义;通过双斜杠的方式定义同样的正则表达式:
1.通过字面量创建:var 变量名=/表达式/模式修饰符
eg:var re = /a/gi;
2.通过构造函数创建:new RegExp("表达式","模式修饰符")
eg:var re = new RegExp("a","gi");//匹配所有的a或A
通过构造函数创建需要更多的转义字符\
RegExp构造函数第一个参数为正则表达式的文本内容,而第一个参数则为可选项标志.标志可以组合使用
g (全文查找)
i (忽略大小写)
m (多行查找)
正则表达式基本语法
两个特殊的符号'^'和'$';他们的作用是分别指出一个字符串的开始和结束。
例子如下:
"^The":表示所有以"The"开始的字符串("There","The cat"等);
"of despair$":表示所以以"of despair"结尾的字符串;
"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;
"notice":表示任何包含"notice"的字符串。
象最后这个例子,如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分——你并不把它定位在某一个顶端。
其它还有'*','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数;它们分别表示“没有或更多”,“一次或更多”还有“没有或一次”。
下面是几个例子:
"ab*":表示一个字符串有一个a后面跟着零个或若干个b("a", "ab", "abbb",……);
"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
"ab?":表示一个字符串有一个a后面跟着零个或者一个b;
"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。
你也可以使用范围,用大括号括起,用以表示重复次数的范围。
"ab{2}":表示一个字符串有一个a跟着2个b("abb");
"ab{2,}":表示一个字符串有一个a跟着至少2个b;
"ab{3,5}":表示一个字符串有一个a跟着3到5个b。
请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。
还有,你可能注意到了,'*','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。
还有一个'|',表示“或”操作:
"hi|hello":表示一个字符串里有"hi"或者"hello";
"(b|cd)ef":表示"bef"或"cdef";
"(a|b)*c":表示一串"a""b"混合的字符串后面跟一个"c";
'.'可以替代任何字符:
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.{3}$":表示有任意三个字符的字符串(长度为3个字符);
方括号表示某些字符允许在一个字符串中的某一特定位置出现:
"[ab]":表示一个字符串有一个"a"或"b"(相当于"a|b");
"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a|b|c|d"或者"[abcd]");
"^[a-zA-Z]":表示一个以字母开头的字符串;
"[0-9]%":表示一个百分号前有一位的数字;
",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。
你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。
(如:"%1%"表示两个百分号中不应该出现字母)。
为了逐字表达,你必须在"^.$()|*+?{"这些字符前加上转移字符''。
请注意在方括号中,不需要转义字符。
和正则表达式相关的方法和属性
正则表达式对象的方法
正则表达式有3个方法:test()、exec() 以及 compile()
test():检测给定的字符串是否满足正则表达式,返回一个 Boolean 值,如果只是单纯的判断被查找的字符串中是否存在,不需要其他的处理,可以使用compile,把正则表达式编译为内部格式,从而执行得更快。
eg:
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free")); //由于该字符串中存在字母 "e",以上代码的输出将是:true
exec():检索字符串中的指定值,返回值是被找到的值;如果没有发现匹配,则返回 null。
eg1:
var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free")); //由于该字符串中存在字母 "e",以上代码的输出将是:e
您可以向 RegExp 对象添加第二个参数,以设定检索。例如,如果需要找到所有某个字符的所有存在,则可以使用 "g" 参数 ("global")
在使用 "g" 参数时,exec() 的工作原理如下:
找到第一个 "e",并存储其位置;如果再次运行 exec(),则从存储的位置开始检索,并找到下一个 "e",并存储其位置
eg2:
var patt1=new RegExp("e","g");
do{
result=patt1.exec("The best things in life are free");
document.write(result);
}
while (result!=null) //由于这个字符串中6个 "e" 字母,代码的输出将是:eeeeeenull
compile():方法用于改变 RegExp;compile() 既可以改变检索模式,也可以添加或删除第二个参数。
eg:
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
patt1.compile("d");
document.write(patt1.test("The best things in life are free"));//由于字符串中存在 "e",而没有 "d",以上代码的输出是:truefalse
正则表达式对象的属性
source:返回正则表达式模式的文本复本,只读。
lastIndex:返回字符位置,它是被查找字符串中下一次成功匹配的开始位置。
1...1...9:返回九个在模式匹配期间找到的、最近保存的部分,只读。
input ($_):返回执行规范表述查找的字符串,只读。
lastMatch ($&):返回任何正则表达式搜索过程中的最后匹配的字符,只读。
lastParen ($+):如果有的话返回任何正则表达式查找过程中最后括的子匹配,只读。
leftContext ($`):返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符,只读。
rightContext ($'),返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符,只读。
String对象一些和正则表达式相关的方法
match:找到一个或多个正则表达式的匹配。
replace:替换与正则表达式匹配的子串。
search:检索与正则表达式相匹配的值。
split:把字符串分割为字符串数组。
RegExp对象实例的一些属性
每个RegExp对象的实例具有lastIndex属性,它是被查找字符串中下一次成功匹配的开始位置,默认值是-1。 lastIndex 属性被 RegExp 对象的 exec 和 test 方法修改.并且它是可写的;当匹配失败(后面没有匹配),或lastIndex值大于字符串长度时,再执行exec等方法会将lastIndex设为0(开始位置)
RegExp对象的静态属性
multiline属性返回正则表达式是否使用多行模式,这个属性不针对某个正则表达式实例,而是针对所有正则表达式,并且这个属性可写.(IE与Opera不支持这个属性)
使用元字符注意事项:元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,必须对这些元字符转义;下面是正则表达式用到的所有元字符( [ { ^ $ | ) ? * + .
使用RegExp构造函数与使用正则表达式字面量创建正则表达式注意点
既然双重转义这么不友好,所以还是用正则表达式字面量的声明方式
另处,还有一些其它的预定义特殊字符,如下表所示:
字符 | 描述 |
---|---|
n | 换行符 |
r | 回车符 |
t | 制表符 |
f | 换页符(Tab) |
cX | 与X对应的控制字符 |
b | 退格符(BackSpace) |
v | 垂直制表符 |
0 | 空字符("") |
字符类 ---〉简单类,反向类,范围类,组合类,预定义类
下面是正则表达式中的预定义类
代码 | 等同于 | 匹配 |
---|---|---|
. | IE下2,其它3 | 匹配除换行符之外的任何一个字符 |
d | [0-9] | 匹配数字 |
D | 4 | 匹配非数字字符 |
s | [ nrtfx0B] | 匹配一个空白字符 |
S | 5 | 匹配一个非空白字符 |
w | [a-zA-Z0-9_] | 匹配字母数字和下划线 |
W | 6 | 匹配除字母数字下划线之外的字符 |
贪婪量词与惰性量词
?用贪婪量词进行匹配时,它首先会将整会字符串当成一个匹配,如果匹配的话就退出,如果不匹配,就截去最后一个字符进行匹配,如果不匹配,继续将最后一个字符截去进行匹配,直到有匹配为止。直到现在我们遇到的量词都是贪婪量词
?用惰性量词进行匹配时,它首先将第一个字符当成一个匹配,如果成功则退出,如果失败,则测试前两个字符,依次增加,直到遇到合适的匹配为止
惰性量词仅仅在贪婪量词后面加个"?"而已,如"a+"是贪婪匹配的,"a+?"则是惰性的