常見需求如下:
- 如果你只需要獲取字串中的首個匹配項
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
來學習編寫符合我需求的正規表示式。
視覺化檢視正規表示式(複雜版),很直觀,神器一枚
視覺化檢視正規表示式(簡化版)