javascript正则表达式基础相关
正则表达式提供了一个灵活方便的方式来识别字符、单词或字符序列。javascript里面通过RegExp对象来运用正则表达式。没有找到一个适合自己的中文资料,都说得不够细,写下这些供以后查阅,如果有价值也可方便他人,话说好记性不烂笔头 :)
语法:
var re = RegExp(pattern [, flags]);
var re = new RegExp(pattern [, flags]);
var re = /pattern/flags;
参数:
| pattern | 必须.正则表达式。
Note:要创建一个有实际意义的正则表达式,这个参数一般是必须的。当然如果实例化时不带这个参数,也是没有问题的,只不过实际意义不大。 |
||||||
| flags | 可选.正则的标志,可为下面的何意组合。
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:这样的分类和一般的不同,主要是自己的解理和方便自己,如果对您引起困扰十分抱歉。
| Character | Description | |
|---|---|---|
| 断言(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'。 |
属性:
| Property | Support | Description | |||||
|---|---|---|---|---|---|---|---|
| $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。 |
方法 :
| Method | Support | Description | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| compile (newPattern, [flags]) |
|
用newPattern替换RegExp对象的pattern,并编译成内部格式方便更快的执行。
|
|||||||||
| exec (string) |
|
在了个一个字符串中,执行一个正则表达式的搜索。返回结果或null。 返回数组属性 点击
|
|||||||||
| test (string) |
|
在了个一个字符串中,执行一个正则表达式的搜索。返回true或false。
|
|||||||||
| toSource ( ) |
|
返回正则表达式字符串。 |
|||||||||
| toString ( ) |
|
返回正则表达式字符串。当正则表达需要转化成string时,javascript解释器会自动调用toString方法。 |
exec方法返回一个数组,数组有一些额外的属性,如下:
| Property | Support | Description | |||||
|---|---|---|---|---|---|---|---|
| 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个捕获子式,如果不存在则不替换 |
参考:
DottorECMA 262
MDN
浙公网安备 33010602011771号