javascript正規表示式小技巧

白牙青森發表於2013-07-11

一、中括號[]裡面的特殊字元是不用轉義的,例如[/]、[.]、[*]、[?]、[+]都是可以直接匹配對應的字元\ . *?+。下面是測試結果:

  

  所以,/[\d.]/這個正規表示式實際上是匹配數字字元或者字元".",作用等同於/[\d\.]/

  

二、match()、exec()和test()的區別

1. regexp.test()

test() 方法執行一個檢索,用來檢視正規表示式與指定的字串是否匹配。返回 true 或 false

/in[a-z]/g.test("ing");   // true
/in[a-z]/g.test("string"); //true

var reg = new RegExp("in[a-z]", "g");
reg.test("string");  // true

2.regexp.exec(string)

如果成功匹配,exec 方法返回一個陣列,並且更新正規表示式物件的屬性。返回的陣列包括匹配的字串作為第一個元素,緊接著一個元素對應一個成功匹配被捕獲的字串。

 另外,返回的陣列物件還包含indexinput屬性:

  • index表示被匹配的字串的第一個字元在源字串中的位置。
  • input表示源字串。
var re = /in([a-z])in([a-z])/g; 
var result = re.exec("stringina strinaing");     //["ingina", "g", "a"]

result .index;     //     3
result .input;    //  "stringina strinaing"

 

物件 屬性/索引 描述 例子
result [0] 上一次匹配到的字元 ingina
[1], ...[n ] 括號中的分組捕獲
[1] = g
[2] = a
index 匹配到的字元位於原始字串的基於0的索引值 3
input 原始字串
stringina strinaing
re lastIndex 下一次匹配開始的位置 9
ignoreCase 是否使用了'i'標記使正則匹配忽略大小寫 false
global 是否使用了'g'標記來進行全域性的匹配. true
multiline

是否使用了'm'標記使正則工作在多行模式(也就是,^ 和 $ 可以匹配字串中每一行的開始和結束(行是由 \n 或 \r 分割的),而不只是整個輸入字串的最開始和最末尾處。)

false
source 正則模式的字串 in([a-z])in([a-z])

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

3. string.match(regexp)

match()返回一個被指定正則匹配到的匹配項陣列

如果正規表示式沒有 g 標誌,返回和 RegExp.exec(str) 相同的結果。

如果正規表示式包含 g 標誌,則該方法返回一個包含所有匹配結果的陣列。如果沒有匹配到,則返回 null

var reg = new RegExp('in([a-z])in([a-z])');
var result = "stringinastringinb".match(reg);    //   ["ingina", "g", "a"]
result.index;             //  3
result.input;             //  "stringinastringinb"

var reg= new RegExp('in([a-z])in([a-z])','g');
var result ="stringinastringinb".match(reg);    //  ["ingina", "inginb"]
result.index;             //  undefined
result.input;             //  undefined

PS:另外要注意的是lastIndex只對exec()和test()方法起作用,string.match(regexp)是不會影響regexp這個正則的lastIndex屬性的。

相關文章