知識社群登入
位置: Web Programming > 文件區 > Javascript > Regular Expression
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()
分割字串
by 蘇德宙, 2011-04-18 01:04, 人氣(1353)
1. exec()

2. test()