1. 程式人生 > >suhiymof的專欄

suhiymof的專欄

部分規則:

\d可以匹配一個數字,\w可以匹配一個字母或數字,比如:

   12\d可以匹配123,\d\d\d可以匹配123;

.可以匹配任意字元

 'js.'可以匹配'jsp''jss''js!'等等。

要匹配變長的字元,在正則表示式中,用*表示任意個字元(包括0個),用+表示至少一個字元,用?表示0個或1個字元,用{n}表示n個字元,用{n,m}表示n-m個字元:

  來看一個複雜的例子:\d{3}\s+\d{3,8}

  我們來從左到右解讀一下:

  1. \d{3}表示匹配3個數字,例如'010'

  2. \s可以匹配一個空格(也包括Tab等空白符),所以\s+表示至少有一個空格,例如匹配' '

    '\t\t'等;

  3. \d{3,8}表示3-8個數字,例如'1234567'

  綜合起來,上面的正則表示式可以匹配以任意個空格隔開的帶區號的電話號碼。

  如果要匹配'010-12345'這樣的號碼呢?由於'-'是特殊字元,在正則表示式中,要用'\'轉義,所以,上面的正則是\d{3}\-     \d{3,8}

  但是,仍然無法匹配'010 - 12345',因為帶有空格。所以我們需要更復雜的匹配方式。

要做更精確地匹配,可以用[]表示範圍,比如:

  • [0-9a-zA-Z\_]可以匹配一個數字、字母或者下劃線;

  • [0-9a-zA-Z\_]+可以匹配至少由一個數字、字母或者下劃線組成的字串,比如'a100'

    '0_Z''js2015'等等;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下劃線、$開頭,後接任意個由一個數字、字母或者下劃線、$組成的字串,也就是JavaScript允許的變數名;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)。

 A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配'JavaScript''Javascript''javaScript'或者'javascript'

 ^表示行的開頭,^\d表示必須以數字開頭。

 $表示行的結束,\d$表示必須以數字結束。

js也可以匹配'jsp',但是加上^js$就變成了整行匹配,就只能匹配'js'了。

除了簡單地判斷是否匹配之外,正則表示式還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:

javascript:^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:

var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null

如果正則表示式中定義了組,就可以在RegExp物件上用exec()方法提取出子串來。

exec()方法在匹配成功後,會返回一個Array,第一個元素是正則表示式匹配到的整個字串,後面的字串表示匹配成功的子串。

exec()方法在匹配失敗時返回null

再舉幾個js例子:

var re = /0+/;
var re2 = /^(0?[1-9]|1?[0-2])\:(0?[1-9]|1?[0-9]|2?[0-9]|3?[0-1])$/;
console.log('2:30'.split(re2)); // true
var re1 = /(\d{3})-(\d{3,8})-(\d{3})/;
console.log('010-12345-456'.split(/^(\d{3})-(\d{3,8})-(\d{3})$/)); // true
console.log(re1.exec('010-12345-456')); // ['010-12345', '010', '12345']
console.log(re1.exec('010-12345')); // null
console.log(re2.exec('02:01')); // null
var re3 = /^(\d+?)-(0*)$/;
console.log(re3.exec('10231024-00')); // ['102300', '1023', '00']
var re4 = /^(.+?)@(.+?)\.(com)$/;

輸出結果: