EcmaScript正則表達式( 深入淺出系列之淺出 )
?來源:http://www.v-ec.com/dh20156/article.asp?id=202
使用方法
創(chuàng)建對象
??? var r = new RegExp("表達式","ig");
??? 適合在動態(tài)構(gòu)造匹配對象時使用;
??? 表達式中轉(zhuǎn)義符需要使用兩次,如//d;
直接量
??? var r = /表達式/ig;
??? 使用在任何固定模式的匹配;
常用屬性
$1...$9
??? 返回九個在模式匹配期間找到的、最近保存的部分。只讀。
index
??? 返回第一個成功匹配的開始位置。只讀。
lastIndex??? *(注意)
??? 返回最后一次成功匹配的位置(下一次匹配開始的位置)。讀寫。
??? 只有當(dāng)使用exec()或test()函數(shù)時才會寫入。
lastMatch
??? 返回最后匹配的字符。只讀。
input
??? 返回查找的字符串。只讀。
lastIndex
考慮以下代碼:
<script type="text/javascript">
var r = //d/g;
alert(r.test('abc1'));
alert(r.lastIndex);
alert(r.test('ab1'));
alert(r.lastIndex);
alert(r.test('a1'));
alert(r.lastIndex);
</script>
lastIndex屬于實例屬性
當(dāng)一個正則表達式實例多次test或exec時,它的lastIndex將每一次都被更改。
量詞
?
??? 出現(xiàn)0次或1次
*
??? 出現(xiàn)0次或多次
+
??? 出現(xiàn)1次或多次
{n}
??? 一定出現(xiàn)n次
{n,m}
??? 至少出現(xiàn)n次,最多出現(xiàn)m次
{n,}
??? 至少出現(xiàn)n次
貪婪與非貪婪(惰性)的量詞
貪婪匹配:
?
*
+
{n}
{n,m}
{n,}
非貪婪匹配:
??
*?
+?
{n}?
{n,m}?
{n,}?
貪婪與非貪婪的匹配過程
考慮以下代碼:
<script type="text/javascript">
var s = 'http://www/hello/world.php';
var r1 = /.*///g;
var r2 = /.*?///g;
alert(s.match(r1));
alert(s.match(r2));
</script>
//貪婪匹配
匹配整個字符串
從后逐一舍去最后一個字符繼續(xù)
http://www/hello/
//非貪婪匹配
從第一個字符開始匹配
如果失敗,讀入下一個字符繼續(xù)
http:/,??? /,??? www/,??? hello/
分組、反向引用與非捕獲性分組
用來匹配以一系列字符為一個單位的模式
??? (一系列的字符作為一個整體哦)
每創(chuàng)建一個分組,在執(zhí)行test()、match()、search()、replace()后,可以通過全局$1...$9屬性來獲取匹配到的每一個分組。
分組匹配將帶來一定的效率損耗,如果有時候不需要獲取分組的結(jié)果,可以使用非捕獲性分組:(?:一系列的字符)
候選
用來匹配a or b or n...模式。比如,匹配文件類型:
<script type="text/javascript">
var s = 'http://www/hello/world.png.php';
var r = /(?:jpg|gif|png)$/i;
alert(r.test(s));
</script>
前瞻
正向前瞻
??? var r = /(aaa(?=bbb))/;
??? 用于匹配后面緊挨著的是bbb的串a(chǎn)aa
負向前瞻
??? var r = /(aaa(?!bbb))/;
??? 用于匹配后面緊挨著的不是bbb的串a(chǎn)aa
Replace
Replace中使用正則,第二個參數(shù)是函數(shù)!
<script type="text/javascript">
var str = 'aaZbbZccZ';
var s = str.replace(/(.*?)Z/g,
function(){
??? var ar = [];
??? for(var i=0;i<arguments.length;i++){
??????? ar.push(arguments[i]);
??? }
??? alert(ar);
??? ar.length = 0;
??? return arguments[2];
}
);
alert(s);
</script>
當(dāng)有反向引用時:
arguments[0]:匹配到的串
arguments[1]:$1
arguments[2]:$2
.............................
arguments[arguments.length-2]:匹配到的位置
arguments[arguments.length-1]:要匹配的字符串
否則,有3個形參:
arguments[0]:匹配到的串
arguments[1]:匹配到的位置
arguments[2]:要匹配的字符串
?
Replace應(yīng)用
不用循環(huán)輸出一至一百:
<script type="text/javascript">
var sAAA = new Array(100+1).join("a");
var sNum = sAAA.replace(/a/g,function(){
??? return arguments[1]+1+"<br/>"
});
document.write(sNum);
</script>
替換所有<>為[]:
<script type="text/javascript">
var str = '<a>a</a><b>b</b><c>c</c>';
var s = str.replace(/(<)|>/g,function(x,y){
??? return (y)?'[':']';
});
alert(s);
</script>
PPT下載:http://www.v-ec.com/dh20156/code/EcmaScriptRegExp.ppt
總結(jié)
以上是生活随笔為你收集整理的EcmaScript正則表達式( 深入淺出系列之淺出 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 团队贡献分的分配方式
- 下一篇: 索尼官方拆解 PS VR2,揭示头显如何