2008年6月20日 星期五

正規式符號.

1. Regular expression 的用途

  Regular expression 是 JavaScript 中的一種文字方程式, 利用一些代號來代表某些文字組合, 例如 \d 代表數目字元, \D 代表非數目字元, \w 代表一個英文字, \s 代表空格, 等等, 我們利用這些代號組合, 就可在一個字串 (string) 中找到是否有符合 (match) 我們指定的某個字元組合 (這些字元組合是為 pattern)。

  Regular expression 是在 Netscape-4 新增的功能, 使用 Perl 語言的習慣, Perl 是Internet 中普遍使用的程式語言, 強項是在文字處理方面, 所以 regular expression 最適用於 form 內有關文字及數字的 validation, 一些複習檢查, 使用 regular expression 就可簡易造到, 若使用 JavaScript 的 charAt( )charCodeAt( ) 等來檢查, 未必能做到, 就算做到, 程式會很長及很複雜, 若有大量檢查就會使到網頁很長, 浪費傳送時間。

  Regular expression一般是與 String object 的 match( )search( ) replace( ) 合用, 請先看以下例子。

第12章 String object(

2. Regular expression 的設定

  設定一個 regular expression 有以下兩個語法,

   /pattern/flag
或  new RegExp("pattern", "flag")

  我們一般會用 re (自訂的變數名稱) 來代表一個 regular expression, 所以會有以下的 statements:

   re=/pattern/flag
或  re=new RegExp("pattern", "flag")

  這處的 pattern 是指文字方程式, flag 可以是 gi gi , 隨後會有解釋。例如pattern 是要檢查一句文字中是否有 apple 或 orange 兩個字, 不理會大小寫, 有以下語法:

re=/apple|orange/gi

  這處要留意, 除非真的要找一個空格, 否則不要在 regular expression 內加上空格, 請看以下例子:

re=/on/   這是找 on 兩個字母, 包括 on、don't、pond 等等。
re=/ on/ 這是找前面有空格的 on, 即是三個字符, 包括 ononce、only等等, 不包括 don't、pond 等等。

第12章 String object(

3. match(re) 的使用

  match( ) String 的一個 method, 與 re 合用, 有這語法:

x = str.match(re)

  這 str 代表我們設定或在文字框輸入的字串, re 是一個 regular expression, 這語法是要在 str 這字串中尋找是否符合 re 的文字, 若有的就傳回這文字及以 x 這變數來代表, 若無就傳回 null 字。

使用 global match:

1. 留意今次例子的 re=/apple|orange/gi , 這句之後有 g 的操作指示, g代表 global match, 即是尋找全部文字, 符合的會全部列出, 顯示時用 , 來分隔, 若不作這指定, 找到第一個字後就不再找下去。

2. 若在上述例子作這設定: re/apple|orange/i , 找到 apple 這字後, 就不再找下去, 所以對話盒中只會顯示 apple 一個字。

  例如在文字框輸入以下一句:

No money, no home, but NOT desperate and nothing to worry.

若使用 re=/no/i 會傳回一個 No 字 (第一個找到的字)。
若使用 re=/no/gi 會傳回 No,no,NO,no 四個字 (全部找到的字)。

  留意句子後方的 NOT 及 nothing 兩個字, 我們要找的是 no 這兩個字母, 這也包括一個字內的字母。若是指定不要字內的字母, 就要用 /\bno\b/gi , \b 代表字與字間的分隔, 所以會傳回 No,no 這結果。

 

使用 ignore case:

  前段例子的 re=/no/gi , 這句之後有 i 的操作指示, i 代表 ignore case, 即是不理會文字的大小寫, 以這句為例:

No money, no home, but NOT desperate and nothing to worry.

若使用 re=/no/g 會傳回 no,no 兩個字。
若使用 re=/No/g 會傳回 No。
若使用 re=/NO/g 會傳回 NO。
若使用 re=/no/gi 會傳回 No,no,NO,no。

  若不加上 i 的指示, 尋找的字會分大小寫, 若指定找 no, 就不包括 No 或 NO。

Regular expression 的代號:

  Regular expression 有以下二十多個代號:

\ 代表隨後的字元是代號, 例如 /d/ 符合 d 字元, /\d/ 符合任何數目字。
^ 代表一句的開頭, 例如 /^x/ 符合 xyz 的 x, 但不符合 wxyz 的 x。
$ 代表一句的尾, 例如 /c$/ 符合 abc 的 c, 但不符合 abcd 的 c。
* 代表前方的字元出現 0 或多次, 例如 /abc*/ 符合 ab, abc, abcc, abccc 等等。
+ 代表前方的字元出現 1 或多次, 例如 /abc*/ 符合 abc, abcc, abccc 。
? 代表前方的字元出現 0 或 1 次, 例如 /abc*/ 符合 ab 或 abc。
. 代表任何一個字元, 例如 /.r/ 符合 ar, br, cr 等等。
(a) 代表 a 及記下這元字, 例如 /(blue)/ 符合 blue color 內的 blue 字, 並記下這blue 字, 請看隨後 $1...$9 的一段中的解釋。
x|y 代表 x 或 y , 例如 /blue|red/ 符合 blue car 的 blue 及 red car 的 red。
{n} n 是個正數, 代表前個位置的字元出現的次數, 例如 /x{3}/ 是代表 3 個 x 字。
{n,} n 是個正數, 代表前個位置的字元出現最少的次數, 例如 /x{3,}/ 是代表 3 個或以上的 x 字。
{n,m} n 及 m 是正數, 代表前個位置的字元出現最少 n 次, 最多 m 次數, 例如 /x{3,8}/ 是代表 3 至 8 個的 x 字。
[xyz] 這是一組字元, 內裡任何一個字元皆合, 例如 /[pqr]/ 是符合 p、q 或 r, 但不符合 s 及 t。用 hyphen可指定一個範圍, 例如 /[0-9]/ 是代表任何數目字, /[a-e]/ 是代表 a 至 e 的字元。
[^xyz] 這是一組相反字元, 內裡任何一個字元皆不合, 例如 /[^abc]/ 是符合任何字元除了 a、b 及 c, /[^a-z]/ 是不符合任何英文字母。
[\b] 代表 backspace (退格鍵)。
\b 代表分隔兩字間的字元 (word boundary), 例如空格及 = ( / 等符號, 例如 /\bg/ 符合 .g =g %g ,g (g 等等, 也符合 so good 的 g 字或一句之首的 g 字, 但不符合 begin 或 again 的 g 字。
\B 代表非分隔字元, 即是代表字母或數字, 例如 /\Bst\/ 可代表 1st 或 paste 的 st, 但不代表 street 的 st。
\cX X 代表任何控制字元 (control character), 例如 /\cM/ 代表 control-M, 即是回位字元 (carriage return)。
\d 代表任何數目字, 即是 0-9, 例如 /\d\d/ 代表兩個數目字。
\D 代表任何非數目字, 即是英文字母及標點符號。
\f 代表 form-feed (即是分頁)。
\n 代表 line-feed (即是分行)。
\r 代表 carriage return (即是回位)。
\s 代表任何空位, 包括 space(空格)、tab(跳格)、form feed (分頁) 及 line feed (分行), 即是空格及 [\f\n\r\t\v] 例如 /o\s\w*/ 代表 too good 的 o good。
\S 代表任何非空位字元, 即不是 \s。
\t 代表 tab (跳格字元)。
\v 代表 vertical tab (即是 ctrl-K)。(在一般文書處理器, line feed 是分行及分段, vertical tab 是分行, 但不分段。)
\w 代表字母、數目字及 underscore, 即是 a-z、A-Z、0-9及 _ , 但不包括標點符號及其他特別字符, 例如不包括 ! @ # 等等。
\W 代表非 \w 的字元, 即是不包括 a-z、A-Z、0-9及 _ 的字元, 例如 /\W/ 符合 #123 或 $30 的 # 或 $。
\xhex 這是用 ASCII 碼來表示一個字元, 使用的是十六進位 (hex) 數字, 例如 /\x5b/ 符合 [OK] 中的 [ 。


Buildin Character Class

表示法 意義
\d 等於 [0-9]
\D 等於 [^0-9]
\w 等於 [A-Za-z]
\W 等於 [^A-Za-z]
\s 等於 [ \r\t\n\f]
\S 等於 [^ \r\t\n\f]

【下列文章您可能也有興趣】

2 則留言:

中阿呱 提到...

很有參考價值..加入最愛了。
謝謝整理喔!

千江有水千江月 提到...

這也是從網路上來的資料, 歡迎大家使用.