当前位置: 代码迷 >> Web前端 >> 正则表达式札记
  详细解决方案

正则表达式札记

热度:229   发布时间:2012-09-25 09:55:59.0
正则表达式笔记

?

使用RegExp的显式构造函数,语法为:new RegExp("pattern"[,"flags"])。?

使用RegExp的隐式构造函数,采用纯文本格式:/pattern/[flags]。?

pattern部分为要使用的正则表达式模式文本,是必须的。

在第一种方式中,pattern部分以JavaScript字符串的形式存在,需要使用双引号或单引号括起来,这时首尾不需要'/'。

在第二种方式中,pattern部分嵌套在两个“/”之间,不能使用引号。

由于JavaScript字符串中的“\”是一个转义字符,因此,使用显式构造函数创建RegExp实例对象时,应将原始正则表达式中的“\”用“\\”替换

如:var reg1 = new RegExp("\\d{2}");?

? ? ? var reg2 = /\d{2}/; ?

???? var? reg = new RegExp("^(\\+|-)?\\d+(\.\\d{0,2})?$");?? //可有两位小数的浮点数

含变量的时候:

? ? ? var a = "abc",

? ? ? reg3 = new RegExp("^\\d" + a + "\\d$");

由于正则表达式模式文本中的转义字符也是“\”,如果正则表达式中要匹配原义字符“\”,在正则表达式模式文本中要以“\\”来表示,当使用显式构造函数的方式创建RegExp实例对象的时候,就需要使用“\\\\”来表示原义字符“\”。?

var reg = new RegExp(\\\\)。?

?

?

下面再复习下最常用的 test exec match search ?replace ?indexOf ?split 7个方法

var str = "" ,str1 = ""; //字符串

var reg = new RegExp(); ?//reg对象

var x = [] ; ?//返回的数组

g ?//全局匹配

i ? //不区分大小写

m //多行模式匹配

?

?

1.test ?

? ? 格式: reg.test(str); ? ? // 返回true 或false;

? ? ? eg: ? /(a)\w+/.test("abcde") ? ?//返回true;

?

2.exec

?

? ?格式:reg.exec(str); ? ?//返回一个数组 ?数组第一项为匹配的表达式 ?如果有匹配的子表达式则数组第二项为子表达式 以此类推。exec永远返回与第一个匹配相关的信息,不管有没有g

?

? ? ?eg: /a(b)\w+/.exec("abcdef"); ?//返回的数组 x[0] = “abcdef” ,x[1] = "b";

? /ab\w+/g.exec("abcde.fabc") ?//返回"abcde"

?

3.match

?

? ?格式:str.match(reg); ? //返回一个数组 ?如果没有全局标识符g 则和exec一样,第一项 为匹配的表达式, 如果有匹配的子表达式则数组第二项为子表达式 以此类推。如果reg有全局标识符g ?则 第一项 为第一个匹配的表达式,第二项 为第二个匹配的表达式 以此类推。

?

? ? eg : ?"abcdef.abc".match(/a(b)\w+/); ? ? ? 返回 x[0] = “abcdef”,x[1] = "b";

?

? ? ? ? ? ? ?"abcdef.abc".match(/a(b)\w+/g); ? ?返回 x[0] = ?“abcdef” ,x[1] = "abc";

?

有关exec ?和 match ?的区别 ? 这里有篇文章说的比较详细:http://makemyownlife.iteye.com/blog/395172

?

4.search ??

?

? ?格式: str.search(reg); ? 返回从字符串中寻找指定值的位置,如果没找到则返回-1。它将忽略标志g。它同时忽略regexp 的lastIndex 属性,并且总是从字符串的开始进行检索。

?

? ? ?eg: ? "abcdef".search(/a/) ? //返回0

?

5. indexOf

?

格式:str.indexOf(str1[,startIndex]) ; 返回从字符串中寻找指定值的位置,如果没找到则返回-1,可以指定开始检索的位置 ,和search的区别是str1不能是正则表达式。

?

6.replace ?

?

? ? 格式:str.replace(reg,str1) ; ? ?返回 替换后的字符串 ? 支持 i、g、m

?

? ? ?eg: ?"abcdef".replace(/a/,"b") ?返回:“bbcdef”;

? ? ? ? ? ? "abcdefaa".replace(/a/ig,"b") ? 返回:“bbcdefbb”;

? ? ?当str1为function时 返回的$1为正则表达式相匹配的文本,$2为子表达式匹配的文本,依此类推。

? ? ?当str1为$1$2...时,则$1$2分别匹配相对应的子表达式。

? ? ?eg:

? ? ? ? ? ?var a = "abcealsk";

? ? ? ? ? ?var c1 = a.replace(/(ab)c/ig,function($1,$2){return $1 + $2}); ?//返回:abcabealsk

? ? ? ? ? ?var c2 = a.replace(/(ab)c/ig,"$1$2"); ? //返回:ab$2ealsk ? //此时$2没有对应的字表达式被当做字符串返回了。

??? 比如常用的去掉字符串两端的空格

??? var a = "? a a ";
??? var b = a.replace(/(^\s*)|(\s*$)/g,'');? 或 var b = a.replace(/^\s*(\w+.*\w+)*\s*$/,'$1');

??? b为‘a a’

?

7.split?

?

? ?格式:str.split(reg); ?返回按照reg划分后的数组 ?支持i

?

? ? ? eg: ?"a_b_B_d_e".split(/b/i); ? 返回:[a_,_,_d_e]