隨手查閱的正則匹配筆記

Alexee發表於2019-01-28

常見需求如下:

  • 如果你只需要獲取字串中的首個匹配項
var re = /quicks(brown).+?(jumps)/ig;
var result = re.exec(`The Quick Brown Fox Jumps Over The Lazy Dog`);
// 就算有 g 標識,通過 exec 也只能獲取到首個匹配項
// result[0]: Quick Brown Fox Jumps
複製程式碼
  • 使用了 g 標識時(不使用時以下方法也適用),如果你想獲取正則中的組匹配(capture groups)資訊
var re = /quicks(brown).+?(jumps)/ig;
var result = re.exec(`The Quick Brown Fox Jumps Over The Lazy Dog`);
// index 1~n 就是組匹配到的結果(此處正則中有兩個括號,則 n 為 2)
// result[1]: Brown
// result[2]: Jumps
複製程式碼

關於 exec 的更多詳細說明可以檢視 MDN 文件 RegExp.prototype.exec()

  • 不使用 g 標識時,如果你想獲取正則中的組匹配(capture groups)資訊
`mockid=272;其他說明文字……`.match(/mockid=(d+);/i)
// ["mockid=272;", "272", index: 0, input: "mockid=272;其他說明文字……"]
// 如果加上 g 標識,就只能得到 ["mockid=272;"]
複製程式碼
  • 匹配多種可能出現的值,獲取最終匹配到的值
`GET/path/to/some/place`.match(/^(GET|POST|PUT|DELETE)/gi)
// 輸出:["GET"]
複製程式碼

關於 match 的更多詳細說明可以檢視 MDN 文件 String.prototype.match()

  • 只想知道是否匹配某個正則(true or false)
// RegExp.prototype.test()
var str = `hello world!`;
var result = /^hello/.test(str);
console.log(result); // true
複製程式碼
  • 字串是否匹配其中一種情況
let type = `Array`;
/Array|Object/.test(type) // true
複製程式碼

關於 test 的更多詳細說明可以檢視 MDN 文件 RegExp.prototype.test()

// String.prototype.search()
var str = "hey JudE";
var re = /[A-Z]/g;
var re2 = /[.]/g;
console.log(str.search(re)); // returns 4, which is the index of the first capital letter "J"
console.log(str.search(re2)); // returns -1 cannot find `.` dot punctuation
// 因此可以直接判斷返回負值時匹配結果為 false
複製程式碼

關於 search 的更多詳細說明可以檢視 MDN 文件 String.prototype.search()

  • 對匹配成功的字串進行處理
function replacer(match, p1, p2, p3, offset, string) {
  // p1:([^d]*) p2:(d*) p3:([^w]*)
  // p1 非數字, p2 數字, p3 非文字
  return [p1, p2, p3].join(` - `);
}
var newString = `abc12345#$*%`.replace(/([^d]*)(d*)([^w]*)/, replacer);
console.log(newString);  // abc - 12345 - #$*%
複製程式碼

推薦正則工具:

非常好用的一個正則編寫工具,我會點開左側選單欄裡的 cheatsheet 來學習編寫符合我需求的正規表示式。

視覺化檢視正規表示式(複雜版),很直觀,神器一枚

視覺化檢視正規表示式(簡化版)

相關文章