2015年11月23日 星期一

Formal Language - Ch3.5 常用的正則表示式 Regular Expression in Application

 

正則表達式真的很好用,這邊整理了一些關於正規表達式的資料,這部分算是資工領域中最讓人崩潰的表達式了XD




一、常用的 regular expression


//信用卡檢查

‘/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|622((12[6-9]|1[3-9][0-9])|([2-8][0-9][0-9])|(9(([0-1][0-9])|(2[0-5]))))[0-9]{10}|64[4-9][0-9]{13}|65[0-9]{14}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})*$/’

//檢查字串只能有文字與數字

‘/^[a-zA-Z0-9]*$/’

//檢查字串只能有文字

 ‘/^[a-zA-Z]*$/’

//檢查字串只能有數字

‘/^[0-9]*$/’

//檢查日期型態 (MM/DD/YYYY)

‘/^((0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2})*$/’

//檢查日期型態 (YYYY/MM/DD)

 ‘#^((19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))*$#’

//簡易的Email檢查

‘/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$/’

//檢查IP位址

‘/^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$/’

//檢查密碼

 ‘/^(?=^.{8,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$/’

//檢查網址

‘/^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$/’






二、regular expression 寫法教學




正規表示式
說明及範例
比對不成立之字串
/a/
含字母 “a” 的字串,例如 “ab”, “bac”, “cba”
“xyz”
/a./
含字母 “a” 以及其後任一個字元的字串,例如 “ab”, “bac”(若要比對.,請使用 \.)
“a”, “ba”
/^xy/
以 “xy” 開始的字串,例如 “xyz”, “xyab”(若要比對 ^,請使用 \^)
“axy”, “bxy”
/xy$/
以 “xy” 結尾的字串,例如 “axy”, “abxy”以 “xy” 結尾的字串,例如 “axy”, “abxy” (若要比對 $,請使用 \$)
“xya”, “xyb”
[13579]
包含 “1” 或 “3” 或 “5” 或 “7” 或 “9” 的字串,例如:”a3b”, “1xy”
“y2k”
[0-9]
含數字之字串
不含數字之字串
[a-z0-9]
含數字或小寫字母之字串
不含數字及小寫字母之字串
[a-zA-Z0-9]
含數字或字母之字串
不含數字及字母之字串
b[aeiou]t
“bat”, “bet”, “bit”, “bot”, “but”
“bxt”, “bzt”
[^0-9]
不含數字之字串(若要比對 ^,請使用 \^)
含數字之字串
[^aeiouAEIOU]
不含母音之字串(若要比對 ^,請使用 \^)
含母音之字串
[^\^]
不含 “^” 之字串,例如 “xyz”, “abc”
“xy^”, “a^bc”


正規表示式的特定字元
說明
等效的正規表示式
\d
數字
[0-9]
\D
非數字
[^0-9]
\w
數字、字母、底線
[a-zA-Z0-9_]
\W
非 \w
[^a-zA-Z0-9_]
\s
空白字元
[ \r\t\n\f]
\S
非空白字元
[^ \r\t\n\f]


正規表示式
說明
/a?/
零或一個 a(若要比對? 字元,請使用 \?)
/a+/
一或多個 a(若要比對+ 字元,請使用 \+)
/a*/
零或多個 a(若要比對* 字元,請使用 \*)
/a{4}/
四個 a
/a{5,10}/
五至十個 a
/a{5,}/
至少五個 a
/a{,3}/
至多三個 a
/a.{5}b/
a 和 b中間夾五個(非換行)字元

字元
說明
簡單範例
\
避開特殊字元
/A\*/ 可用於比對 “A*”,其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 “\”
^
比對輸入列的啟始位置
/^A/ 可比對 “Abcd” 中的 “A”,但不可比對 “aAb”
$
比對輸入列的結束位置
/A$/ 可比對 “bcdA” 中的 “A”,但不可比對 “aAb”
*
比對前一個字元零次或更多次
/bo*/ 可比對 “Good boook” 中的 “booo”,亦可比對 “Good bk” 中的 “b”
+
比對前一個字元一次或更多次,等效於 {1,}
/a+/ 可比對 “caaandy” 中的 “aaa”,但不可比對 “cndy”
?
比對前一個字元零次或一次
/e?l/ 可比對 “angel” 中的 “el”,也可以比對 “angle” 中的 “l”
.
比對任何一個字元(但換行符號不算)
/.n/ 可比對 “nay, an apple is on the tree” 中的 “an” 和 “on”,但不可比對 “nay”
(x)
比對 x 並將符合的部分存入一個變數
/(a*) and (b*)/ 可比對 “aaa and bb” 中的 “aaa” 和 “bb”,並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。
xy
比對 x 或 y
/a*b*/g 可比對 “aaa and bb” 中的 “aaa” 和 “bb”
{n}
比對前一個字元 n 次,n 為一個正整數
/a{3}/ 可比對 “lllaaalaa” 其中的 “aaa”,但不可比對 “aa”
{n,}
比對前一個字元至少 n 次,n 為一個正整數
/a{3,}/ 可比對 “aa aaa aaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa”
{n,m}
比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數
/a{3,4}/ 可比對 “aa aaa aaaa aaaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa” 及 “aaaaa”
[xyz]
比對中括弧內的任一個字元
/[ecm]/ 可比對 “welcome” 中的 “e” 或 “c” 或 “m”
[^xyz]
比對不在中括弧內出現的任一個字元
/[^ecm]/ 可比對 “welcome” 中的 “w”、”l”、”o”,可見出其與 [xyz] 功能相反。(同時請注意 /^/ 與 [^] 之間功能的不同。)
[\b]
比對退位字元(Backspace character)
可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別
\b
比對英文字的邊界,例如空格
例如 /\bn\w/ 可以比對 “noonday” 中的 ‘no’ ;
/\wy\b/ 可比對 “possibly yesterday.” 中的 ‘ly’
\B
比對非「英文字的邊界」
例如, /\w\Bn/ 可以比對 “noonday” 中的 ‘on’ ,
另外 /y\B\w/ 可以比對 “possibly yesterday.” 中的 ‘ye’
\cX
比對控制字元(Control character),其中 X 是一個控制字元
/\cM/ 可以比對 一個字串中的 control-M
\d
比對任一個數字,等效於 [0-9]
/[\d]/ 可比對 由 “0” 至 “9” 的任一數字 但其餘如字母等就不可比對
\D
比對任一個非數字,等效於 [^0-9]
/[\D]/ 可比對 “w” “a”… 但不可比對如 “7” “1” 等數字
\f
比對 form-feed
若是在文字中有發生 “換頁” 的行為 則可以比對成功
\n
比對換行符號
若是在文字中有發生 “換行” 的行為 則可以比對成功
\r
比對 carriage return

\s
比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v]
/\s\w*/ 可比對 “A b” 中的 “b”
\S
比對任一個非空白字元,等效於 [^ \f\n\r\t\v]
/\S/\w* 可比對 “A b” 中的 “A”
\t
比對定位字元(Tab)

\v
比對垂直定位字元(Vertical tab)

\w
比對數字字母字元(Alphanumerical characters)或底線字母(”_”),等效於 [A-Za-z0-9_]
/\w/ 可比對 “.A _!9″ 中的 “A”、”_”、”9″。
\W
比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]
/\W/ 可比對 “.A _!9″ 中的 “.”、” “、”!”,可見其功能與 /\w/ 恰好相反。
\ooctal
比對八進位,其中octal是八進位數目
/\oocetal123/ 可比對 與 八進位的ASCII中 “123” 所相對應的字元值。
\xhex
比對十六進位,其中hex是十六進位數目
/\xhex38/ 可比對 與 16進位的ASCII中 “38” 所相對應的字元。



三、regular expression 實務使用


從其他地方貼文章到blogger會發現一件可怕的事,編輯欄會把之前的格式一行一行用html指定,所以字體大小常常不能跟著網頁的框架,突然想到可以用以前學過的的正規表達式(regular expression)挖掉標籤,效果不錯!用下面幾行調整一下就可以簡單挖掉blogger自動套用的標籤。

regular expression 有一個特性, 叫做貪婪 (greediness) -- 能吃多少, 就盡量吃多少。
大部分 「一對雙引號之間的字串」 都被正確抓出; 但是有些地方卻因為一列上出現數個字串, 而令 regexp 抓過頭了。要解決這個問題, 可以用 [^...] "除了 ... 之外的任何一個字元"。 只要將 "任意字元重複出現任意次" 改成 "除了雙引號之外的任意字元重複出現任意次" 就可以了。


 $ font-size: [0-9]*px;
 $ font-size: ([a-zA-Z]*|[0-9]*px);
 $ style="[^<]*"



左側圖是使用前,右側圖是使用後,行數密度顯著下降。


發現regular expression真的還滿好用的:)






Reference



阿維雜記本 - 常用的正規表示式(Regular Expression)
http://blog.hsdn.net/1391.html

就是愛程式 - 正規表示式 Regular Expression
https://atedev.wordpress.com/2007/11/23/正規表示式-regular-expression/






技術提供:Blogger.