需要被脫逸的符號 :
\
: 可以脫逸字元
[
]
: [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 則是比對的方式
Examples
數量 : 不能為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\.\-~!@#$%^&*+?:_\/=<>]*)?)/g
or
((http[s]{0,1}|ftp):\/\/[a-zA-Z0-9\.\-\_\/]+\.([a-zA-Z]{2,4})(:\d+)?(\/[a-zA-Z0-9\.\-~!@#$%^&*+?:_\/=<>]*)?)
正規取代驗證多餘空白:
^(.*[^\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)
開頭不是某個字元
-
開頭不是 my
^(?!my)\w+$
- my name is Cathy
- her name is Lily (matched)
- this build is amazing
- my chest is sore (matched)
-
開頭不是 1/3/5
^(?!.[135]).$
- 1
- 2 (matched)
- 3
- 4 (matched)
- 5
比對 src=" ... "
符合相對路徑的 path
$reg = '(src=["|\'](?!.*(http[s]?))(?!.*(www\.))[\/]?(([^\s\[\\"\'])+)["|\'])';
match連結並且顯示頭4個字元
改成:
$message = 'google : www.google.com.tw ,yahoo : http://www.google.com.tw';
$message = preg_replace_callback(
"/(((http[s]?):\/\/|www\.)([^\s\[\\\"'])+)/",
function ($matches) {
if (substr(strtolower($matches[0]), 0, 4) == 'www.')
{
return '<a href="http://'. $matches[0] .'" target="_blank">'. $matches[0] .'</a>';
}
return '<a href="'. $matches[0] .'" target="_blank">'. $matches[0] .'</a>';
},
$message
);
return $message;
得到預期的結果:
google : www. ,yahoo : http