Reference:
1. JavaScript: The Definitive Guide, 5e, David Flanagan, O'REILLY
目錄
by 蘇德宙, 2011-04-17 22:38, 人氣(1500)
1. 建立 RegExp (pattern 描述)
2. 比對字串並處理
var re= new RegExp("s$"); // 以字母 s 為最後一個字元的字串
var re= /s$/; // created literally
範例: 比對出 "全部" "不分大小寫" 的 「javascript」,並取代成 「JavaScript」
var text = "javascript is THE scripting language of the Web. \
Javascript is used in billions of Web pages to \
add functionality, validate forms, communicate with the server, and much more. \
JAVAScript is easy to learn. You will enjoy it.";
text.replace(/javascript/ig, "<b>JavaScript</b>");
文字字元
文字數字: 比對自己
\0 NULL 00
\t TAB 09
\n 換行 0A
\v 重直定位 0B
\f 換頁 0C
\r 游標返回 0D (carriage return)
\x## 16 進位字母,如 \x0A = \n
\u#### 16 進位的 unicode
\cX 控制字元 ^X,如 \cJ = \n
特殊意義字元,需要用跳脫符號 \ 來比對
^: 第一個字元的字串
$: 最後一個字元的字串
.: 任意字元,除了換行字元與 unicode 行結束
*: 0 個以上
+: 1 個以上
? = ! : | \ () [] {} ...
by 蘇德宙, 2011-04-17 22:38, 人氣(1493)
[]: /[abc]/ 比對在 [] 內 a、b、c 其中任何一個字元
^: /[^abc] a、b、c 以外的任何字元 (negated character class)
-: /[a-z]/ 比對所有小寫字母
/[a-zA-Z0-9/ 比對所有字母和數字
使用特殊字元表示常用字元類別,如
\w 代表任意 ascii 字元,相當於 [a-zA-Z0-9_]
列表整理
[...]: 任意在 [] 中的字元
[^...]: 任意「不」在 [] 中的字元
.: 任意字元,除了換行或 unicode 行結束字元
\w: 任意 ascii 字元,[a-zA-Z0-9_]
\W: 任意「非」 ascii 字元,[^a-zA-Z0-9_]
\s: 任意 unicode 空白字元
\S: 任意「非」 unicode 空白字元
\d: 任意 ascii 數字,[0-9]
\D: 任意非 ascii 數字,[^0-9]
[\b]: 比對 \b (backspace) 字元,因為 \b 有「字的邊界」的特殊意義
by 蘇德宙, 2011-04-17 23:31, 人氣(1376)
REF: http://www.regular-expressions.info/repeat.html
{n, m}: 至少 n 次,但不超過 m 次
{n, }: n 次以上
{n} : 剛好 n 次
?: 比對前面的項目 0 或 1 次,{0,1}
+: 1 次或 1 次以上,{1,}
*: 0 次或 0 次以上,{0,}
範例
/\d{2,4}/: 2 位數到 4 位數之間的數字
/\w{3}\d?/: 3 個字元和一個選擇性的數字
/\s+java\s+/: java 前後再加上一個或多個空白
/[^"]*/: 0 個或 0 個以上非引號的字元
*, ? 的注意事項
/a*/ 也會比對出 bbbb,因為含有 0 個以上的 a
不貪心重複比對 (ungreedy / reluctant) with ?
var text = "aaa";
/a+/ 比對出 aaa
/a+?/ 比對出 a (不貪心重複比對)
by 蘇德宙, 2011-04-18 00:01, 人氣(1458)
| : 選擇
/ab|cd/,比對出 ab 或 cd
() : 子運算式,將 () 內的當做一個單位
/java(script)+/,比對出 java,後面有沒有 script 都可以
() : 子樣式 subpattern
var text = "abc123";
/[a-z]+(\d+)/ 則比對出 abc123 後取出 () 內的 123 存入變數 $1, $2, ...
例如,alert(text.replace(/[a-z]+(\d+)/, "-$1-")); // alert "-123-"
\n : 參考子樣式
/['"][^'"]*['"]/ 比對出 "asd' (前後的 ", ' 不同)
/(['"])[^'"]*\1/ 則前後引號要一致 (注意: 非 ['"] 樣式,而是符合樣式的文字內容)
如果 () 內加 ? 號則不列入參考,例如 /(a)(?:b)(c)/ 中 \2 會參考到 c
by 蘇德宙, 2011-04-18 00:43, 人氣(1653)
^: 比對字串的開始,多列時,比對一列的開端
$: 比對字串的結尾,多列時,比對一列的結尾
\b: 比對字體邊界,例如 /\bJava\b/ 比對出 Java 但不會比對出 Javascript
(注意: /\sJava\s/ 會將空白納入)
\B: 比對不是字體邊界,例如, /\Bscript/ 比對出 Javascript,但不會比對出 script
(?=p): look ahead assert,比對出後續字元符合 p,但不納入
例如,/Javascript (?=:) 比對出 Javascript: The definite Guide 中的 Javascript
但不會比對出 Javascript in a Nutshell
(?!p): ... 不符合 p
by 蘇德宙, 2011-04-18 00:48, 人氣(1340)
/ ... /igm
i: 不區分大小寫
g: 全域比對,不會只找到一個就停止
m: 多列模式,例如 /Java$/m 比對出 "Java" 和 "Java\nis fun" (一列或字串的結尾)
by 蘇德宙, 2011-04-18 00:55, 人氣(1398)
1. search()
比對並傳回位置,return -1 或 第一個符合的子字串起點的位置
ex. var pos = "Javascript".search(/script/i); // return 4
2. replace()
比對並取代,ex.
1. text.replace(/javascript/gi, "JavaScript");
2. text.replace(/"([^"]*)"/g, "'$1'");
3. match()
比對並傳回陣列
4. split()
分割字串