2010年4月29日 星期四

JavaScript正則表達式

轉貼自:http://www.wxwdesign.cn/article/skills/javascript_regular_expression.htm

正則表達式是基於grep和ed這些Unix管理工具發展而來的,使用正則表達式可以使字符串處理變得更加方便快捷,以下內容主要是JavaScript 正則表達式的一些基礎知識彙總:

1. JavaScript正則表達式的實現

JavaScript 對正則表達式的支持是通過ECMAScript中的RegExp類實現的,RegExp對象的構造函數可以帶一個或兩個參數。第一個參數描述需要進行匹配 的模式字符串,第二個參數指定了額外的處理指令。

示例代碼:
程序代码 程序代碼

var re=new RegExp("test","gi");


實現方法二:使用Perl風格的語法(較常用)

程序代码 程序代碼
var re=/test/gi;  //這種方式和上面是一樣的效果


2. 使用RegExp對象的方法

RegExp對象主要方法 有:RegExp.test(String)  RegExp.exec(String)  String.match(RegExp)  String.search(RegExp)

2.1 test()方法

test()方法,如果給定字符串匹配這個模式, 就返回true,否則返回false。

示例代碼:
程序代码 程序代碼

var re=/test/;
alert(re.test("this is the test content"));  //output "true"


2.2 exec()方法

exec()方法和test()用法類似,不過 exec返回的是一個數組,並且只有一個條目,既是第一次的匹配。

示例代碼:
程序代码 程序代碼

var re=/test/gi;
alert(re.exec("this is the test content"));  //output "test"


2.3 match()方法

match()方法也是返回一個數組,不過使用方 法和上面有區別,match的使用方法為String.match(RegExp)。

示例代碼:
程序代码 程序代碼

var re=/te/gi;
alert(("this is the test content").match(re)); //output "te, te"


2.4 search()方法

search()方法和字符串的 indexOf()方法類似,返回在字符串中出現的一個匹配的位置。

示例代碼:
程序代码 程序代碼

var re=/te/i;
alert(("this is the test content").search(re)); //output 12


3. 在字符串方法中使用正則表達式

在字符串方法String.replace()和String.split()中使用正 則表達式。

3.1 String.replace()

示 例代碼:
程序代码 程序代碼

var re=/te/gi;
alert(("this is the test content").replace(re,"ok"));  //output "this is the okst conoknt"


3.2 String.split()

示例代碼:
程序代码 程序代碼

var re=/te/gi;
alert(("this is the test content").split(re)); //output "this is the ,st con,nt"


4. 使用元字符

JavaScript正則表達式元字符:
程序代码 程序代碼
( [ { \ ^ $ | ) ? * + .

任何時候要在正則表達式中使用元字符,都必須對他們進行轉義。

示例代碼:
程序代码 程序代碼

var re=/\?/   //匹配?
var re2=new RegExp("\\?");   //匹配?


第 二行的定義中使用兩個反斜槓,主要是因為JavaScript字符串解析器會按照\n的方式翻譯\?,為了保證不出現這個問題,所以要在元字符前面使用兩 個反斜槓,我們稱之為雙重轉義。

5. 使用特殊字符

在表達式中可以使用字符串本身, 也可以使用它的ASCII碼或者Unicode代碼,要用ASCII碼來表示一個字符,則必須制定一個兩位的十六進制代碼,並在前面加上\x。例如:字符 b的ASCII碼為98,轉換成十六進製為62,既是\x62。

示例代碼:
程序代码 程序代碼

var re=/\x62/;
alert(re.test("blue"));  //output "true"


另外也可以使用八進制代替十六進製表示。

示例代碼:
程序代码 程序代碼

var re=/\142/;   //使用八進製表示
alert(re.test("blue"));  //output "true"


如果使用 Unicode來表示字符,必須制定字符串的四位十六進製表示形式,比如b的表示方式為:\u0062

示例代碼:
程序代码 程序代碼

var re=/\u0062/;   //使用Unicode表示
alert(re.test("blue"));  //output "true"


另外一些需要雙重 轉義的字符:
程序代码 程序代碼
\t   \n   \r   \r   \a   \e   \cX   \b   \v    \0



6. 正則表達式字符類

6.1 簡單類 [abc...]

示 例代碼:
程序代码 程序代碼

var re=/[gts]o/g;  //匹配go  to  so
alert(("you go to bed,so will i").match(re));  //output "go to so"


6.2 負向類 [^abc]

負向類主要是採用排除策略,例如[^abc],既是排除a b c三個字符。

示例代碼:
程序代码 程序代碼

var re=/[^gts]o/g;  //排除g t s +o
alert(("you go to bed,so do i").match(re));  //output "yo do"


6.3 範圍類 [a-z]

範圍類主要是不方便枚舉,但連續的一系列字符或數字等。

示例代碼:
程序代码 程序代碼

var re=/a[3-5]/g;
alert(("a1,a2,a3,a4,a5,a6").match(re));  //output "a3,a4,a5"


6.4 組合類 [a-z0-9\r\n]

組合類是有幾種方式組合而成的字 符串。

示例代碼:
程序代码 程序代碼

var re=/[a-b3-5]/g;
alert(("a1,a2,a3,a4,a5,a6").match(re));  //output "a,a,a,3,a,4,a,5,a"


6.5  預定義類

常用的預定義類:
程序代码 程序代碼

.                  [^\n\r]
\d                [0-9]
\D                [^0-9]
\s                [ \t\n\x0B\f\r]
\S                [^ \t\n\x0B\f\r]
\w               [a-zA-Z0-9]
\W               [^a-zA-Z0-9]



7.  量 詞

7.1 簡單量詞
程序代码 程序代碼

?             {0,1}
*             {0,}
+             {1,}
{n}          一定出現n 次
{n,m}      至少出現n次,但不超過m次
{n,}         至少出現n次


示 例代碼:
程序代码 程序代碼

var re=/g?oo?d?/g;    //可匹配o go goo good oo ood od
alert(("to go is good").match(re));   //output "o go good"


7.2 貪婪的(? * + {n} {n,m} {n,})

貪婪的先看整個 的字符串是否匹配,如果沒有匹配,就去掉最後一個字符,然後再次進行匹配,以此規則進行下去......

示例代碼:
程序代码 程序代碼

var str="abc abcd abcde";
var re=/.*c/g;  //貪婪 方式匹配
alert(re.exec(str));  //output "abc abcd abc"


7.3 懶惰的 (?? *?  +?  {n}?  {n,m}?  {n,}?)

懶惰的跟貪婪的匹配方向相反,懶惰的先從第 一個字符開始匹配,如果不成功,就讀入下一個字符繼續進行匹配,以此規則進行下去...


示例代碼:
程序代码 程序代碼

var str="abc abcd abcde";
var re=/.*?c/g;  //貪 婪方式匹配
alert(re.exec(str));  //output "abc"


7.4 支配的 (?+ *+ ++ {n}+ {n,m}+ {n,}+)

支配的只嘗試匹配整個字符串,如果整個字符串不能匹配,不做進一步嘗 試,此方法瀏覽器支持不太好,不推薦使用。

8. 複雜模式

8.1 分組

分組是通過用一系列括號包圍一系列字符、字符類以及量詞來使用 的。

示例代碼:
程序代码 程序代碼

var re=/g(o)+gle/g;  "o"至少出現1次
alert(("gogle google gooooogle").match(re)); //output "gogle google gooooogle"


8.2 反向引用(backreference)

利用分組進行正則匹配後,每個分組都被存儲在一個特殊的地 方,這些存儲在分組中的特殊值,我們稱之為反向引用(backreference)。

示例代碼:
程序代码 程序代碼

var re=/(\d+)/;
re.test("123456789");
alert(RegExp.$1); //output "123456789"


8.3 候選

候選其實就是個or選擇。使用|分隔。

示例代 碼:
程序代码 程序代碼

var re=/you|me/g;
alert(("say you say me").match(re));   //output "you, me"


8.4 非捕獲性分組(?:)

不創建反向引用的分組,我們稱之為非捕獲性分 組,使用非捕獲性分組,可以除去捕獲性分組存儲分組的時間消耗,提高程序執行效率。

示例代碼:
程序代码 程序代碼

var re=/(?:\d+)/;
re.test("123456789");
alert(RegExp.$1); //output ""


8.5 前瞻(lookahead) (?= )

有時候,希望某個特定的字符 出現在另一個字符串之前時,才會捕獲它。前瞻告訴正則表達式運算器向前看一些字符而不移動其位置。  前瞻有負向(?!)和正向(?=)之分。

示 例代碼:
程序代码 程序代碼

var re=/(good(?=lu))/g;
var str="goodluck is lucy";
alert(str.match(re));  //output "good"


8.6 邊界
程序代码 程序代碼

^             行開頭
$              行結尾
\b            單 詞的邊界
\B            非單詞的邊界


示例代碼:
程序代码 程序代碼

var re=/^(.+?)\b/g;  //以懶惰的方式匹配單詞
var str="goodluck is lucy";
alert(str.match(re));  //output "goodluck"


8.7 多行模式(m)

匹配多行,常配合g使用。

示例代碼:
程序代码 程序代碼

var re=/(\w+)$/gm;  //匹配每行末尾的一個單詞
var str="goodluck is lucy\ngo to bed";
alert(str.match(re));   //output "lucy, bed"

沒有留言:

張貼留言

Related Posts with Thumbnails