a:英文字母 a 這個字元,大小寫有區分
0:數字 0 這個字元
.:任意字元,但是不能是換行字串的開頭
-:字元集合,用來指定字源的區間,必須包在中括號裡面
[]:括號內的任何字元
[^]:不在括號內的任何字元
\.:表示 . 這個字元,但是不能寫成 /./ 會被判斷成任意字元
\+:表示 + 這個字元,類似的還有 \? \*
\(:表示 ( 這個字元,類似的還有 \) \[ \]
\\:表示 \ 這個字元
\d:任何數字的字元,等同 [0-9]
\D:任何非數字的字元,等同 [^0-9]
\w:任何數字字母底線,等同 [A-Za-z0-9_]
\W:任何非數字字母底線,等同 [^A-Za-z0-9_]
\s:任何空白字元(空白/換行/tab...),等同 [ \f\n\r\t\v]
\S:任何非空白字元(空白/換行/tab...),等同 [^ \f\n\r\t\v]
\f:form feed 換頁
\n:line feed 換行
\r:carriage return 回列首
\t:tab 制表符
\v:vertical tab 垂直制表符
※ Windows text files use "\r\n" to terminate lines, while Unix test files use "\n"
*:出現 0 次以上,等同於 {0,}
?:出現 0 次或 1 次,可有可無的意思,等同於 {0,1}
+:出現 1 次以上,等同於 {1,}
{n}:出現 n 次
{n,}:出現 n 次以上
{,n}:出現 n 次以下
{n,k}:出現 n 次到 k 次
g:global search,比對字串中所有符合的配對,否則只找一個
i:case-insensitive search,規則不區分大小寫
m:multi-line search,多行比對,^比對每行開頭,$比對每行結尾
^:字串開頭
$:字串結尾
\b:word boundary 比對字串邊界非一般字元
\B:non-word boundary 比對字串邊界為非一般字元
※ 注意 \b 和 [\b] 是不一樣的,[\b] 是用來比對 backspace
(?=):Positive lookahead 代表「往前看是」的意思,後面接上字元
(?!):Negative lookahead 代表「往前看不是」的意思,後面接上字元
※ 以下不支援 IE, Edge, Firefox, Safari,屬於 ES2018 的功能
(?<=):Positive lookbehind 代表「往後看是」的意思,前面接上字元
(?<!):Negative lookbehind 代表「往後看不是」的意思,前面接上字元
|:代表「或」的意思
():代表「群組」的意思
※ 以下不支援 IE, Edge, Firefox
?<GROUPNAME>:代表「群組命名」的意思`,屬於 ES2018 的功能
※ Greedy 盡可能多地從每次出現的特定模式進行比對,可以說是匹配優先
*:greedy 窮盡比對零或多次,類似的還有 + ? {n} {n,} {n,k}
※ Non-greedy(Lazy) 比對的項目愈少愈好,可以說是忽略優先
*?:non-greedy(lazy) 非窮盡比對零或多次 +? ?? {n}? {n,}? {n,k}?
/* 範例一 */
var re = /(\w+)\s(\w+)/;
var str = 'John Smith';
var newStr = str.replace(re, '$2, $1');
console.log(newStr); // "Smith John"
// 每一個 regex 配對到的 "內容" 都會變成一個 $數字
function replacer(match, p1, p2, p3, offset, string) {
// p1 is non-digits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString); // abc - 12345 - #$*%