快速掌握JavaScript正则表达式

EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )

使用方法

創建對象
    var r = new RegExp("表達式","ig");
    適合在動態構造匹配對象時使用;
    表達式中轉義符需要使用兩次,如\\d;


直接量
    var r = /表達式/ig;
    使用在任何固定模式的匹配;

常用屬性

$1...$9
    返回九个在模式匹配期间找到的、最近保存的部分。只读。
index
    返回第一个成功匹配的开始位置。只读。
lastIndex    *(注意)
    返回最后一次成功匹配的位置(下一次匹配開始的位置)。讀寫。
    只有當使用exec()或test()函數時才會寫入。
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屬于實例屬性

當一個正則表達式實例多次test或exec時,它的lastIndex將每一次都被更改。

量詞

?
    出現0次或1次
*
    出現0次或多次
+
    出現1次或多次
{n}
    一定出現n次
{n,m}
    至少出現n次,最多出現m次
{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>

//貪婪匹配
匹配整個字符串
從后逐一舍去最后一個字符繼續
http://www/hello/

//非貪婪匹配
從第一個字符開始匹配
如果失敗,讀入下一個字符繼續
http:/,    /,    www/,    hello/

分組、反向引用與非捕獲性分組

用來匹配以一系列字符為一個單位的模式
    (一系列的字符作為一個整體哦)
每創建一個分組,在執行test()、match()、search()、replace()后,可以通過全局$1...$9屬性來獲取匹配到的每一個分組。
分組匹配將帶來一定的效率損耗,如果有時候不需要獲取分組的結果,可以使用非捕獲性分組:(?:一系列的字符)

候選

用來匹配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的串aaa


負向前瞻
    var r = /(aaa(?!bbb))/;
    用于匹配后面緊挨著的不是bbb的串aaa

Replace

Replace中使用正則,第二個參數是函數!

<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>


當有反向引用時:
arguments[0]:匹配到的串
arguments[1]:$1
arguments[2]:$2
.............................
arguments[arguments.length-2]:匹配到的位置
arguments[arguments.length-1]:要匹配的字符串

否則,有3個形參:
arguments[0]:匹配到的串
arguments[1]:匹配到的位置
arguments[2]:要匹配的字符串
 

Replace應用

不用循环输出一至一百:

<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>

快速掌握JavaScript正则表达式PPT下载:http://www.v-ec.com/dh20156/code/EcmaScriptRegExp.ppt



[本日志由 dh20156 于 2009-04-12 03:34 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Javascript 正则表达式
评论: 2 | 引用: 0 | 查看次数: 3521
回复回复vampire[2008-11-20 09:56 PM | del]
对了 有index属性、lastIndex属性、lastMatch属性,应该还有match吧
回复回复vampire[2008-11-19 11:21 PM | del]
挺好的 star之 记得某期程序员上有篇讲正则的 写的非常棒 忘了文章名叫什么了
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭