javascript正则表达式基础相关

正则表达式提供了一个灵活方便的方式来识别字符、单词或字符序列。javascript里面通过RegExp对象来运用正则表达式。没有找到一个适合自己的中文资料,都说得不够细,写下这些供以后查阅,如果有价值也可方便他人,话说好记性不烂笔头 :)

语法:

var re = RegExp(pattern [, flags]);
var re = new RegExp(pattern [, flags]);
var re = /pattern/flags;

参数:

pattern 必须.正则表达式。

Note:要创建一个有实际意义的正则表达式,这个参数一般是必须的。当然如果实例化时不带这个参数,也是没有问题的,只不过实际意义不大。

flags 可选.正则的标志,可为下面的何意组合。
g 全局匹配。
i 忽略大小写。
m 多行匹配。

Note:FireFox在FireFox3以后有一个新的flag y

说明:

RegExp(pattern[,flags])这个够造很少用也很少见,ECMA 262里也确实提到了,关键是各浏览器也都支持,作为前端没有理由不了解。它的实例化过程是:如果pattern是个一个RegExp对象了,且flags为undefined,返回这个对象;其它的按new RegExp(pattern[,flags])的过程处理。

new RegExp(pattern[,flags]) 常见形式之一,当pattern为动态时常用这种方式创建RegExp对象。 当pattern为一个RegExp对象,而flag不为undefined的时候,会抛出一个TypeErro的错误。如果pattern为string,由于 \ 在string中起着转义的意思,如果正则中要用到\,那就得在string中用\\代替。如:new RegExp("\\d+",g);

特殊字符:

Note:这样的分类和一般的不同,主要是自己的解理和方便自己,如果对您引起困扰十分抱歉。

 CharacterDescription
断言(Assertion) ^ 指明匹配必须开始于输入串的头(即头匹配)。如果指明了多行标识(即m),匹配可以从 \r 或 \n字符后开始。例:/^m/ 不匹配'woman',但是匹配'man'。
$ 指明匹配必须在输入串结束的地方结束(即尾匹配)。如果指明了多行标识(即m),匹配可以 \r或 \n字符结束。例:/m/ 不匹配 'format' ,但是匹配 'form'。
\b

匹配单词边界,不是一个退格![\b]匹配一个退格。一个单词边界可是一个单词的开始处也可是一个单词的结束处,它是一个单词和一个非单词两者间的位置。例:模式:/\ba/g,输入:'an abonlaysea'。

\B

匹配一个非单词边界。例:模式:/\Ba/g,输入:'an abonlyasea'。

pattern1(?=pattern2)

匹配pattern1 仅当patttern1后面紧跟着pattern2。例:/a(?=b)/g 匹配 'a' 仅当 ‘a’字母后面紧跟着 'b'。模式:/a(?=b)/g,输入:'abracadabra'。

pattern1(?!pattern2)

匹配pattern1 仅当patttern1后面不跟着pattern2。例:/a(?=b)/g 匹配 'a' 仅当 ‘a’字母后面不跟着 'b'。模式:/a(?=b)/g,输入:'abracadabra'。

量词 *

匹配前面的子表达式零次或多次 。等价于{0,}。例:模式: /b*a/g ,输入: 'hubba and bubba'。

+

匹配前面的子表达式一次或多次 。等价于{1,}。例:模式: /b+a/g ,输入: 'hubba and bubba'。

?

匹配前面的子表达式零次或一次 。等价于{0,1}。例:模式: /b?a/g, 输入: 'hubba and bubba'.

{n}

n为非负整数。精确匹配前面的子表达式n次。例:模式:/9{2}g/,输入:'79799799979999'。

{n,}

n为非负整数。匹配前面子表达式至少出现n次。例:模式: /9{2,}/g , 输入: '79799799979999'。

{n,m}

n和m都为非负整数,且n<=m。前面子表达式最少出现n次最多出现m次。例:模式: /9{2,3}/g , 输入: '79799799979999'。

预定类 \d

匹配一个数字。等价于[0-9]。例: 模式:/\d/g ,输入: 'a1b23c'。

\D

匹配一个非数字。等价于[^0-9]。例:模式:/\D/g ,输入: 'a1b23c'。

\w

匹配一个字母数字或下画线。等价于:[a-zA-Z0-9_]。例:模式:/\w+/g ,输入: '5+23'。

\W

匹配一个非字母数额和下画线。等价于[^A-Za-z0-9_] 。例:模式: /\W+/g,输入: '5+23'。

\s

匹配任何的空白字符。例:模式: /s\sa/g ,输入: 'Thats all'。

\S

匹配任何非空白字符。例:模式: /\Sa/g ,输入: 'Thats all'。

控制符 \f

匹配一个换页符。等价于:\x0c。(换页符会引起打印机前进一页长度或到下一页的顶部。)

\n

匹配一个换行符。等价于 \x0a。

\r

匹配一个回车符。等价于 \x0d。

\t

匹配一个制表符。等价于 \x09。

\v

匹配一个垂直制表符。等价于 \x0b。

其它 \

\ 字符有两种不同的意思,取决于跟在它后面的字符。

1、后面跟字母,这表示一个特殊字符。例:/d/ 匹配 ‘a’字符,而/\d/ 则匹配一个数字。一些字母和 \ 一起用没用意义。将 \ 和这些字符一起用会引起错误。

2、后跟特殊字符,这表示这个字符本身。例:/a*/ 匹配任意数目的a,但是 /a\*/ 只匹配 'a*'。

.

(点号)匹配任意单字符除换行符(\n,\r,\u2028,\u2029)外。用[\s\S] 匹配任意字符包括换行符。例:模式: /.s/g ,输入: 'sail the seas'.

(pattern)

匹配pattern并存储这个匹配(叫作"捕获括号"、“捕获子表达式”或“括号子表达式”)

(?:pattern)

匹配pattern不存储这个匹配

pattern1|pattern2

匹配pattern1或pattern2。例:模式: /(a|r)/g ,输入 : 'agreed'。

[xyz]

一个字符集。匹配括号中的任意一个字符。例:模式:/[adr]/g ,输入:'agreed'。

[^xyz]

一个否定字符集。匹配除括号内的任意字符。例:模式: /[^adr]/g ,输入: 'agreed'。

[a-z]

一个字符范围。匹配字符范围内的任意一个字符。

[^a-z]

一个否定的字符范围。匹配除这个字符范围外的任意字符。

\cx

x是一个从A-Z或a-z的字符。匹配控制字符。例: \cI 匹配 Control-I (tab).

\n

n是个正整数。如果在此之前整个正则表达式包含至少n个捕获子表达式,\n 指向前面第n个被捕获的子表达式。否则n必须是一个8进制码。例:模式:: /(\d+)\+\1/g ,输入: '23+12, 23+23, 12+12+23'。

\0

匹配一个NULL字符。

\ooo

匹配一个8进制码为ooo的字符。例('+' 的8进制码为\053):模式: /\053/g ,输入:’23+12'。

\xhh

匹配一个16进制码为hh的字符。例('+' 的16进制码为 \x2B):模式:/\x2B/g,输入: '23+12'。

\uhhhh

匹配一个Unicode码为hhhh的字符。例('+' 的Unicode码为 \u002B):模式:/\u002B/g,输入: '23+12'。

属性:

PropertySupportDescription
$1...$9

这些属性被exec和test方法执行时填充,用于指向“捕获子表达式”的匹配子串。

属性$1...$9都是静态的,不能通过RegExp的实例进行存取,只允许RegExp.$1.....RegExp.$9。他们只包含最后exec或test运行后的一些结果。因此,当同时有几个RegExp实例一起使用时,$1....$9就不能提供完美功能了。这时,避免使用test方法,用exec方法代替。exec方法返回的数组也包含与这些“捕获子表达式”相匹配的子串。

global

返回一个Boolean值, 指明global标志(g)的状态。如果创建RegExp对象实例时设置g标志,该属性 返回True,否则返回False。

Note:些前见有人说这个值的默认值为-1,这个说法应该是理解错了。ECMA中如是描述,globa为Boolean值,如果有g标志则global为true,否则为false.

ignoreCase

返回一个Boolean值, 指明ignoreCase标志(i)的状态。如果创建RegExp对象实例时设置i标志,该属性 返回True,否则返回False。

index

这个属性被exec和test方法执行时填充 ,用于包含基于0的匹配串的开始位置。这个index属性是静态的,不能通过RegExp实例化对象存取,只能通过RegExp.index存取。RegExp.index仅包含最后一次关于exec或test运行的信息。跨浏览,用exec方法返回的数组的index属性。

input

这个属性被exec和test方法执行时填充,用于包含最后一次的搜索字符串。input属性是静态的,不能通过RegExp实例对象存取,只能过RegExp.index存取。RegExp.input仅包含最后一次关于exec或test运行的信息。跨浏览,用exec方法返回的数组的input属性。

lastIndex

这个属性被exec和test方法执行时填充 ,用于包含基于0的匹配串的结束位置。可以通过RegExp实例对象存取。RegExp.lastIndex属性只有IE支持。

multiline

返回一个Boolean值, 指明multiline标志(m)的状态。如果创建RegExp对象实例时设置m标志,该属性 返回True,否则返回False。

source

返回这个正则表达式源码串。

prototype

返回RegExp.prototype对象引用。不能过能实例对象访问,只通过RegExp.prototype。

方法 :

MethodSupportDescription
compile (newPattern, [flags])

用newPattern替换RegExp对象的pattern,并编译成内部格式方便更快的执行。

pattern

必须.String 要编译的模式。

flag

可选.String 可以为'g','i','m'任意组合。

exec (string)

在了个一个字符串中,执行一个正则表达式的搜索。返回结果或null。

返回数组属性 点击

string

必须. 目标字符串。

test (string)

在了个一个字符串中,执行一个正则表达式的搜索。返回true或false。

string

必须. 目标字符串。

toSource ( )

返回正则表达式字符串。

toString ( )

返回正则表达式字符串。当正则表达需要转化成string时,javascript解释器会自动调用toString方法。

exec方法返回一个数组,数组有一些额外的属性,如下:

PropertySupportDescription
index

返回基于0的匹配串的开始位置。

input

返回目标字符串。

lastIndex

返回基于0的匹配串的结束位置。这个属性只有IE支持,别的浏览器用RegExp实例对象的lastIndex属性代替。

相关:

常用与正则表达式相关的方法有7个,正则里的compile,exec,test和string里的replace,split,search,match(正三串四)。这里关心四方法exec,test,search,match。exec算是比较核心的,从这个说起。

假如有执行这样句代码:reg.exec(str)。exec方法在内部的运算过程大致如下:

var R=reg,
	S=str.toString(),
    length=S.length,
    lastIndex=R.lastIndex,
    i=lastIndex,
    global=R.global,
	r;
if(global==false) i=0;
var matchSuccessed=false;
while(matchSuccessed==false){
	if(i<0||i>length){
		R.lastIndex=0;
		return null;
	} 
	var matchResult=R.[[Match]](S,i);//正则表达式的内部匹配方法,传递S和i作为参数。
	if(matchResult=="failure"){
		i=i+1;	
	}
	else{
		r=matchResult;//匹配成功时返回的一些信息。
		matchSuccessed=true;
	}
}
if(global==true) R.lastIndex=r.endIndex;
var n=r中捕获子表达式的长度,
	A=[];
A.index=i;
A.input=S;
A.length=n+1;
A[0]=匹配子串;
A[1..n]=捕获子串;
return A;

  上面体现了内部的大致运算过程,用于更好的理解global,lastIndex,input等属性的作用和被赋值的过程,万不可当成内部就是这么执行的,其实内部要复制得多。test方法内部是调用exec方法,通过评估exec方法的返回值返回true或false。考虑两个题:

  1.

var str="5.25 is 5.25";
var reg=/\d{2}/g;
alert(reg.test(str));
alert(reg.test(str));
alert(reg.test(str));
alert(reg.test(str));
alert(reg.test(str));

  2.

var str="onlysea";
var reg=/\d{2}/g;
reg.test(str);
alert(RegExp.input);

  都明白了么?

match的执行也会用到exec,假如执行str.math(reg)。如果reg.global为false,则调用exec用str作为参数,用exec的返回作为match的返回。如果reg.global为true,建立一个数组(假设为A),进入循环调用exec方法(以str为参数),将匹配的串push到A里,直到exec返回来null退出循环。如果数组A的length>0则返回这个数组,否则返回null。考虑下面问题(IE除外):

var str="onlysea onlysea";
var reg=/on/g,reg2=/on/;
var m=str.match(reg),
	m2=str.match(reg2);
alert(m);
alert(m.input);
alert(m.index);
alert(m2);
alert(m2.input);
alert(m2.index);

replace的处理过程和match差不多,假如执行str.replace(searchValue,replaceValue)。如果searchValue为正则且global为false,搜索第一个的匹配串并进行替换;global若为true,就是边搜索边替换,直到没有匹配的串。如果searchValue为string,替换第一个匹配的。repalceValue若为function,则每次规制时执行这个function用它的返回值做替换值,参数从左到右依次为:匹配的子串[,捕获串1[,捕获串2[,...]],匹配串在str中的开始位置,str。如果searchValue为正则且replaceValue为字符串,replaceValue中出现的$$,$',$`,$n等可能会被替换,如下:

字符代替文本
$$ $
$& 匹配的子串
$` 目标串中匹配子串前面的部分

Note:`在哪里?Tab的上面 ;)

$' 目标串中匹配子串后面的部分
$n 第n个捕获子式,如果不存在则不替换
$nn 第nn个捕获子式,如果不存在则不替换

参考:

Dottor
ECMA 262
MDN
posted @ 2011-08-10 17:10  only sea  阅读(661)  评论(0编辑  收藏  举报