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