Jex’s Note

正則表達式, 符號對照及範例

需要被脫逸的符號 :

  • \ : 可以脫逸字元
  • [ ] : [xyz] 比對中括孤內的任一個字元 , 但不會將配對到的字串存入RegExp變數中
  • ( ) : 合起來 (x) 比對x並將符合的部份存入一個變數, /(a) and (b)/ 可以對 ‘aaa and bb’ 中的’aaa’和’bb’, 並將這兩個比對得到的字串設定至數字 RegExp.$1 和 RegExp.$2
  • . : 比對任何一個字元 , 但換行符號不算
  • ^ : 啟始位置
  • $ : 結束位置
  • * : 比對前一個字元 , 零次或更多次 , 等於{0,}
  • ? : 比對前一個字元 , 零次或一次 , 等於{0,1}
  • + : 比對前一個字元 , 一次或更多次 , 也等於 {1,}
  • | : 或者 , 等於OR , 邏輯運算子(Logical Operators)

左中括號([)需脫逸 , 但右中括號(])不需脫逸 , 左下到右上的斜線(/)也需要脫逸

符號對照 :

  • \d = [0-9] : 0~9(數字)
  • \D = [^0-9][^\d] : 非數字
  • \l = [a-z] : 小寫英文
  • \L = [^a-z] : 非小寫英文
  • \u = [A-Z] : 大寫英文
  • \U = [^A-Z] : 非大寫英文
  • \n : 比對換行符號
  • \r : 比對 carriage return
  • \s : 比對任一個空白字元(White space character) , 等於 [\f\n\r\t\v]
  • \S : 比對任一個非空白字元 , 等於 [^ \f\n\r\t\v]
  • \t : 比對字位字元(Tab)
  • \v : 比對垂直定位字元(Vertical tab)
  • \w : 比對數字、字母字元或底線 , 等於 [A-Za-z0-9_]
  • \W : 比對非數字、字母字元或底線 , 等於 [^A-Za-z0-9_]
  • \K : start at this position
  • .{6,30} : 6 < 字串長度 < 30
  • ?=.* : 用來判斷右邊緊接的字元是否符合比對條件
  • (?!.*[^\x21-\x7e]) : 不允許特殊符號、數字、英文以外的字元
  • (?=.{10,}) : 檢查字元長度是否超過10
  • (?!.*[\W]) : 不允許非(數字、字母、底線)的字元
  • (?=.*\d):這是 Positive Lookahead,用來判斷右邊緊接著的字元是否符合比對條件,如果符合條件才會繼續比對下去。拿這個實例來說,右邊的字元必須包含一個數字才算符合這個條件。
  • (?=.*[a-zA-Z]):跟上面出現過得 Positive Lookahead 一樣,這是說右邊的字必須包含一個 a 到 z 或是 A 到 Z 的字元,說穿了就是右邊的字要包含一個英文字的意思。

比對方式 :

  • g:全域比對(Global match)
  • i:忽略大小寫(Ignore case)
  • s : 表示我要進行跨行(\n)做比對 //似乎沒有這功能 , 有待查證
  • o : 表示我只要比對一次 //似乎沒有這功能 , 有待查證
  • gi:全域比對並忽略大小寫

語法結構 :

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

pattern 是正規表示法比對規則,flag 則是比對的方式

一些範例 :

數量 : 不能為0的正整數

/^[1-9]\d*$/
  • [1-9] : 開頭要1~9
  • \d* : 0~9的數字出現 0個或多個

價格 : 0 或是正整數

/^(0|[1-9]\d*)$/

0 : 零, | : 或者, [1-9]\d* : 正整數

整數或最多兩位小數

/^(0|[1-9]\d*)(\.\d{1,2})?$/

中文姓名 : 檢查中文字2~5個字

javascript :

/^[\u4e00-\u9fa5]{2,5}$/

中文的正則, 如果把javascript語法搬到php會出現 Warning : preg_match()[function.preg-match] : Compilation failed : PCRE does not support \L , \I , \N , \U or \u at offset 9 的錯誤

解決方法 : 將\u改成\x , 並且將後面的中文代碼用{ } 括起來 , 在表示法最後的斜線後加一個 u

php :

/^[\x{4e00}-\x{9fa5}]{2,5}$/u
  • [\x{4e00}-\x{9fa5}] : 繁體中文字
  • {2,5} : 出現2~5次

email : email格式

/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/

室內電話 : 離鳥區碼最多4碼 , 後面最少5碼最多8碼 . 例如 : 02-42365514

/^[0]{1}[0-9]{1,3}[-]{1}[0-9]{5,8}$/     (前面4碼後面8碼 , 會超過10碼條件 , 所以要再判斷一次 , 如下一行)
/^[0-9-]{10,11}$/                        (共10或11碼)

要驗證兩次 , 如果下次有空的話再改成一行表示法 , 因為很久沒用這個 , 所以有點懶

地址 : 禁止中,英,數,減號( - )以外的字元,至少要連續中文4個字,至少一位數字,字元數共8~40位

/^(?!.*[^\u4e00-\u9fa5a-zA-Z0-9-])(?=.*[\u4e00-\u9fa5]{4,})(?=.*\d).{8,40}$/

網址

/((http[s]{0,1}|ftp):\/\/[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(\/[a-zA-Z0-9\.\-~!@#$%^&amp;*+?:_\/=<>]*)?)/g
or
((http[s]{0,1}|ftp):\/\/[a-zA-Z0-9\.\-\_\/]+\.([a-zA-Z]{2,4})(:\d+)?(\/[a-zA-Z0-9\.\-~!@#$%^&amp;*+?:_\/=<>]*)?)

正規取代驗證多餘空白:

^(.*[^\s])?\s+$`    取代成 `\1
  • ( )裡的東西代表$1
  • [^\s] 結尾無空白
  • \s+結尾為空白

驗證密碼 至少各一位英文字母、數字,共8~12位 :

/^(?!.*[^a-zA-Z0-9])(?=.*\d)(?=.*[a-zA-Z]).{8,12}$/
  • `.{6,30}:表示字串長度要大於等於 6,小於等於 30。
  • ?=.* : 用來判斷右邊緊接著的字元是否符合比對條件,如果符合條件才會繼續比對下去。
  • (?!.*[^\x21-\x7e]) : 不允許特殊符號, 數字, 英文字母以外的字元輸入
  • (?=.{10,}) : 檢查輸入的字元長度是否有超過 10. 如果資料庫裡的密碼欄位長度是 20, 那就改成 (?=.{10,20}).
  • (?!.*[\W]) : 不允許非 (數字、字母、底線)的字元 \W [^a-zA-Z0-9] \w=[a-zA-Z0-9]
  • .*:表示非 “\r”、”\n” 字元出現了 0 或一次以上。

解析: 第一個是判斷不能有小寫及數字以外的字元,第二個是數字至少要有一個,第三個是小寫至少要有一個,第四個是要8~12位

不允許逗號及從頭到尾都是0

^(?!.*[,])(?!.*(^0+$))(.*)$

含有中文字元

(.*?\p{Han})

前後不能有空白

^[^\s]+[A-Za-z\s]{2,21}[^\s]+$

結果 :

  • ABC DEF : true
  • ABC DEF : false
  • ABC DEF : false

[^\s]+ 代表不能有空白, 所以在頭尾各放一個去限制頭尾不能有空白

檢查 05:30 時間格式

^([0-1]+[0-9]|2[0-3]):[0-5][0-9]$

只 match 中間的部份

字串

import javax.faces.application.FacesMessage;

regex

(?<=import ).*?(?=;)

結果

javax.faces.application.FacesMessage

\K example

$ echo 'hello world' | grep -oP 'hello \K(world)'
world
$ echo 'hello world' | grep -oP 'hello (world)'
hello world

配對尾數後面是 0+

^(\d+[1-9]\.?|\d+\.\d+[1-9])(0+)$
  • 前面的 ( … ) 是配對 match 1, 但因為有分整數跟小數, 所以判斷式要分開寫, 用 | (or) 隔開
  • 後面的 (0+) 是配對 match 2

配對結果

  • 12304000 - match 1: 12304, match 2: 000
  • 0.33444400 - match 1: 0.33444, match 2: 00
  • 123.00324000 - match 1: 123.00324, match 2: 000
  • 177.0000 - match 1: 177, match 2: 0000
  • 0.1771 - not matched
  • 10.87 - not matched
  • 10.0087 - not matched
  • 10.872000 - match 1: 10.872, match 2: 000

allowed me any chars , but it cant allowed (0-9) numbers

^([^0-9]*)$

不允許字串 not

^(?!.*not).*$

配對結果

  • You can not see me. - not matched
  • Hi, can you do it?
  • Don’t monkey around.
  • Do not touch it. - not matched

Comments