2016年4月12日 星期二

RegExp: 正則表達式

Regular Expression (正則表達式 or REGEXP) 在本質上是一種小型的特用語言。這種
語言主要是用來做字串的比對、刪除、替換或拷貝重製等工作。

== 字元分類
字元 – 指ASCII 0~255的所有字元和中文字元(也包中文括符號字元)
數字-- 指0-9的字元(數字是ASCII字元的一部份)
字母 --指英文字母,指 abc….z AB…Z(英文字母是ASCII字元的一部份)
字 -- 字是指被符號、空白隔開的文數字串,指 0-9 a-z A-Z 英文底線以及中文字元(不包括中文字符)
英文字 -- 特別指英文的word,
文數字 -- 指英文字母,中文字元和0-9的數字字元的總稱
白字 -- whitespace
隱藏在資料中空白、換行、跳格(tab)等控制字元, 以”\”加上一個字母來表示如

== 控制字元定義
\t Tab ascii 碼 09($09) , 水平跳格
\n new line feed ascii 碼 10 ($0A) , 跳下一行
\v Vertical tab 碼 11($0B) 垂直跳格
\f form feed ascii 碼 14 ($0C), 換到下一頁
\r carrige return ascii碼15 ($0D), 回車,回到一行的開始
\a Bell 碼 07($07) 鈴聲控制字元.
\e ASCII Escape character 碼 27 ($1B), ESC 鍵
\0 變數名稱, 代表先前的整個 REGEXP 子式的全部內容, 不必被( )所包住
\1 - \9 變數名稱, 代表先前 REGEXP 子式內(…) 所搜到的內容將依序被放入了 \1 \2 … \9

== 保留字元
. ^ $ * + ? { } [ ] \ | ( ) 等為正則表達式的保留字元, 若在搜尋樣版中是要用來表達本來的字元時, 則要在這個字元前
面加上"\"的跳脫符號, 各保留字的定義如下
. 指除了\n以外的所有字元
^ 位於[]內的第一個字元表"非"的意思, 如[^abc] 指除了a或b或c以外的字元
^ 在搜尋使用時表搜尋"開頭"相同的字串
$ 在搜尋使用時表搜尋"結尾"相同的字串
{} 用來定義重複的次數, 如 {n}表n次, {2,5}表2~5次, {,5}表0~5次, {5,}表5到無限次
* 指前一個字元出現 0 或 多次的重複, 即{0,}
+ 指前一個字元至少出現 1 次(1 或 多次的重複), 即{1,}
? 指前一個字元出現 0 或 1 次, 即{0,1}, 如搜尋 colou?r 則 color 及 colour 均會找到
[] 設定字元群組
\ - 為"跳脫字元", 用來指定控制字元時使用
| 或(OR)的意思, 也就是以 | 的兩邊的字串做樣版比對搜尋,只要有一個符合, 就是成功
() 設定"字串樣本"時使用, 其設定的樣本會存放在 \1 ~ \9 的變數內
(?...) 當()號內第一個字元為?時則不是"字串樣本"


== 表達式所使用的符號
[] - 指在[]號內的任一字元符合, 如表達式為 [abc]y 時則, ay, by, cy 等均符合
[^] - 指在[^]號內以外的任一字元符合, 如表達式為 [^ab]y 時則, 除了 ay, by 以外的 ?y 均符合


== 字族名稱
為了簡化表示, 因此定義部份字族名稱來表式某特定的字元群組
\d 或 [:digit:] 指0~9的數字, 就是[0-9]
\u 或 [:upper:] 指大寫英文字母, 就是[A-Z]
\l 或 [:lower:] 指小寫英文字母, 就是[a-z]
\w 或 [:word:]  指所有文數字加上”_”底線, 就是[_A-Za-z_0-9]
\s 或 [:space:] 指白字, 如 [\t\n\r\f] 等
\b 所有英文字的邊界字元, 如 空白字元等
\D 或 [^[:digit:]] 指除了0~9以外的字元, 就是[^0-9]
\U 或 [^[:upper:]] 指除了大寫英文字母以外的字元, 就是[^A-Z]
\L 或 [^[:lower:]] 指除了小寫英文字母以外的字元, 就是[^a-z]
\W 或 [^[:word:]]  指非文字,也就是\w字元族以外的所有字元
\S 或 [^[:space:]] 指非白字,也就是\s以外的字元
\B 所有非英文字邊界的字元
\C 或 [:unicode:] 指除了\n以外的所有字元, 和"."保留字作用相同
\Q 及 \E 為了方便設定大量保留字, 可使用 \Q ……\E 的方式, 指定其間的所有字元都是普通字元

== JavaScript 的正則表達式
在 JavaScript 中其正則表達式為一個內建的物件
可用以下方法建立物件
re = new RegExp("pattern", "flag")
re = /pattern/flag    //簡寫格式
其中
pattern 是正則表達式的字串。
flag 是比對的方式:g:全域比對(Global match)i:忽略大小寫(Ignore case)

驗證:使用正則式的 test()函數比對字串是否符合規則, 回傳true代表比對正確, 反之回傳false
ex: 身份證字號驗證
<script>
re = /^[A-Z]\d{9}$/;
str = "A123456789";
if (re.test(str))
alert("成功!");
else
alert("失敗!");
</script>

配合 String 的字串功能進行查詢及更換的功能
搜尋符合規則字串的位置(僅能判斷第一個符合的位置)
使用字串的 search()函數搜尋符合規則字串的位置, 若回傳-1代表沒找到
ex:
ex:
<script>
re = /abc/;
str = "123ABC4512abcwwwewwnA123456789n1abc";
alert("字串位置在第 " + str.search(re) + "個字元");
</script>

搜尋所有符合規則的字串資料
使用字串的 match()函數搜尋符合規則字串的字串內容並放置到一個陣列變數內
若未設定全域搜尋, 則只傳回第一個符合的內容值
ex:
<script>
re = /.*abc.*/g;
str = "12345\n12abcww\nweww\nA123456789\n1abc1";
var matchArray = str.match(re);
var matchValue = "";
for(var ii=0; ii<matchArray.length; ii++){
matchValue = matchValue + matchArray[ii] + "<br>";
}
alert("符合的值為 " + matchValue);
</script>

替換所有符合規則的字串資料
使用字串的 replace()函數替換符合規則的字串
若未設定全域搜尋, 則只替換第一個符合的內容值
ex:
<script>
re = /abc/g;
str = "1234567--abc--1212--abc--ABCOK";
var replaceString = str.replace(re,"替換成功");
alert("替換後的值為 " + replaceString);
</script>

沒有留言:

張貼留言