每次用的时候都要找一遍资料,琢磨一遍语法,不胜其烦,终于下定决心把他们都记下来,一次性搞定,永绝后患!:)
一、什么是正则表达式?
简单地说,就是基于字符串的模式匹配工具。实际应用中包括字符串的查找、提取、替换等等。
二、基本语法
Javascript中的正则表达式的形式一般如下:
/……/
其中“/”为定界符,两个“/”中为模式字符串,也就是用户将要查找的对象的模式,如:/a?b+c*/。该表达式表示的字符串的构成模式为:0个或1个a开头,接着是1个以上的b,最后是任意个c(含0个),如b,ab,bc,abc,bb,abb,abbcc,……。
1.重复匹配语法
在上述表达式中有3个最常用的模式表示符“?”、“+”、“*”,正则表达式中称为“元字符”,他们的含义如下:
“?”:本字符前面的字符(或字符串或表达式)只能出现0次或1次;
“+”:本字符前面的字符(或字符串或表达式)最少出现1次;
“*”:本字符前面的字符(或字符串或表达式)可以出现任意次。
上面的3个元字符模式是固定的,并不灵活,如果要手工定制,可以使用如下模式:
{n}:n >= 0,匹配n次,如'o{2}',能匹配food,但不能匹配Tom。
{n,}:n >= 0,匹配n次以上,如'o{2,}',可以匹配food,foood,fooood,……。
{n,m}:n >= 0,m >= 0, n <= m ,最少匹配n次且最多匹配m次,如'o{2,3}',可以匹配food,foood。
以上介绍的为重复匹配语法,总结如下:
重复语法 | 语法解释 | 语法例子 |
? | 匹配0或1次 | 5?匹配5或0,不匹配非5和0 |
+ | 匹配一次或多次 | /S+匹配一个以上/S,不匹配非一个以上/S |
* | 匹配0次以上 | /W*匹配0以上/W,不匹配非N*/W |
{n} | 匹配n次字符 | /d{3}匹配/d/d/d,不匹配/d/d或/d/d/d/d |
{n,} | 匹配n次和n次以上 | /w{2}匹配/w/w和/w/w/w以上,不匹配/w |
{n,m} | 匹配n次上m次下 | /s{1,3}匹配/s,/s/s,/s/s/s,不匹配/s/s/s/s |
各种匹配语法的使用方法与上面类似,不再详述,罗列如下:
2.字符匹配语法:
字符语法 | 语法解释 | 语法例子 |
/d | 匹配数字(0~9) | ‘/d’匹配8,不匹配12; |
/D | 匹配非数字 | ‘/D’匹配c,不匹配3; |
/w | 匹配任意单字符 | ‘/w/w’ 匹配A3,不匹配@3; |
/W | 匹配非单字符 | ‘/W’匹配@,不匹配c; |
/s | 匹配空白字符 | ‘/d/s/d’匹配3 d,不匹配abc; |
/S | 匹配非空字符 | ‘/S/S/S’匹配A#4,不匹配3 d; |
. | 匹配任意字符 | ‘....’匹配A$ 5,不匹配换行; |
[…] | 匹配括号中任意字符 | [b-d]匹配b、c、d, 不匹配e; |
[^…] | 匹配非括号字符 | [^b-z]匹配a,不匹配b-z的字符; |
3.字符定位语法:
重复语法 | 语法解释 | 语法例子 |
^ | 定位后面模式开始位置 |
|
$ | 前面模式位于字符串末端 |
|
/A | 前面模式开始位置 |
|
/z | 前面模式结束位置 |
|
/Z | 前面模式结束位置(换行前) |
|
/b | 匹配一个单词边界 |
|
/B | 匹配一个非单词边界 |
|
4.转义匹配语法:
转义语法 | 涉及字符(语法解释) | 语法例子 |
“/”+实际字符 | / . * + ? | ( ) { }^ $ | 例如://匹配字符“/” |
/n | 匹配换行 |
|
/r | 匹配回车 |
|
/t | 匹配水平制表符 |
|
/v | 匹配垂直制表符 |
|
/f | 匹配换页 |
|
/nnn | 匹配一个8进制ASCII |
|
/xnn | 匹配一个16进制ASCII |
|
/unnnn | 匹配4个16进制的Uniode |
|
/c+大写字母 | 匹配Ctrl-大写字母 | 例如:/cS-匹配Ctrl+S |
5.操作符及其执行优先级:
优先级从高到低顺利如下:
① / 转义符
② (), (?, (?=), [] 圆括号和方括号
③ *, +, ?, {n}, {n,}, {n,m} 限定符
④ ^, $, /anymetacharacter 位置和顺序
⑤ |“或”操作
“()” 是把字符串组合在一起,作为一个整体来看待,即通常所说的“组”。“()”中的内容必须同时出现在目标对象中,内容中出现“|”例外。
“|”是选择运算符,如:X|Y,表示匹配X或者Y,只能匹配其中1个。
“^”在“[]”内时是否定运算符,如:[^A-C],表示匹配除A、B、C外的任何字符;只有在“[]”外时,才能视作定位符。
三、在Javascript中使用正则表达式
正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具有用正则表达式模式去匹配或代替一个串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)。
1.正则表达式构造函数:
new RegExp("pattern"[,"flags"]);
参数说明:
Pattern:一个正则表达式文本
Flags:如果存在,将是以下值:
g: 全局匹配。换句话说,就是找到所有的匹配,而不是在找到第一个之后就停止
i: 忽略大小写
gi: g和i的组合
除属性 g 和 i 之外,正则表达式就没有其它像属性一样的特性了。如果将构造函数 RegExp的静态属性multiline设置为true,那么模式匹配将以多行的模式进行。在这种模式下,锚字符 ^ 和 $ 匹配的不只是检索字符串的开头和结尾,还匹配检索字符串内部的一行的开头和结尾。例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配"Java/nis fun" 。如果我们设置了 multiline 属性,那么后者也将被匹配:
RegExp.multiline = true;
2.示例:
以网上最常见的去除首尾空格的正则表达式为例:
String.prototype.trim = function() {
return this.replace(/(^/s*)|(/s*$)/g, "");
}
正则表达式“/(^/s*)|(/s*$)/g”包含:一对定界符“/”、全局匹配参数g、匹配字符串起始位置^、匹配空格/s、重复匹配0次或多次*、匹配字符串结束位置$、选择运算符|。
解释:从字符串首(定界符^)开始,第一个括号(^/s*)匹配字符串开头的空白,0个或多个,用""替换;因为参数g的关系,继续匹配,第二次第二个括号(/s*$)匹配字符串结尾的空白,0个或多个,用""替换,结束(定界符$)。
3.常用正则表达式:
"^-[0-9]*[1-9][0-9]*$" //负整数
"^-?/d+$" //整数
"^/d+(/./d+)?$" //非负浮点数(正浮点数 + 0)
"^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数
"^((-/d+(/./d+)?)|(0+(/.0+)?))$" //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数
"^(-?/d+)(/./d+)?$" //浮点数
"^[A-Za-z]+$" //由26个英文字母组成的字符串
"^[A-Z]+$" //由26个英文字母的大写组成的字符串
"^[a-z]+$" //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串
"^/w+$" //由数字、26个英文字母或者下划线组成的字符串
"^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$" //email地址
"^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$" //url
4.最常用的6个方法(test、exec、match、search、replace、split)
1)test检查指定的字符串是否存在
var data = "123123";
var reCat = /123/gi;
alert(reCat.test(data)); //true
2)exec返回查询值
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/i;
alert(reCat.exec(data)); //Cat
3)match得到查询数组
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/gi;
var arrMactches = data.match(reCat)
for (var i=0;i < arrMactches.length ; i++){
alert(arrMactches[i]); //Cat cat
}
4)search返回搜索位置,类似于indexof
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/gi;
alert(data.search(reCat)); //23
5)replace替换字符串
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = /cat/gi;
alert(data.replace(reCat,"libinqq"));
6)split分割字符串为数组
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
var reCat = //,/;
var arrdata = data.split(reCat);
for (var i = 0; i < arrdata.length; i++){
alert(arrdata[i]);
}