JS正則

來源:互聯網
上載者:User

來自於: http://www.wxwdesign.cn/article/skills/javascript_regular_expression.htm

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

1. JavaScriptRegex的實現

JavaScript對Regex的支援是通過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. 在字串方法中使用Regex

在字串方法String.replace()和String.split()中使用Regex。

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. 使用元字元

JavaScriptRegex元字元: 程式碼( [ { \ ^ $ | ) ? * + .

任何時候要在Regex中使用元字元,都必須對他們進行轉義。

範例程式碼: 程式碼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. Regex字元類

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) (?= )

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

範例程式碼: 程式碼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"

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.