簡稱 regexp 或 RE,可以把它想長是字串的規範,只要學會就可以輕鬆代換或搜尋文字,常用在表單輸入後的驗證。
例如,電商網站常常需要輸入email
或電話
,email
會希望@
前後都有字串,電話
希望前兩位是09
,總共有十位數字,諸如此類需要字串判斷的,都可以用 RegExp ,今天介紹一些常用的形式給大家。
Regexp通常會被包在兩個斜線(slash)/…/
或是用%r{…}
也可以。
Regexp
在Ruby裡面是什麼? 也是物件嗎?Regexp
以空白字元為例
/[^\t\r\n\f]/.class # => Regexp
字元表示 | 規則 |
---|---|
. | 所有字元 |
\w | 所有字母,包含大小寫跟數字 |
\d | 所有數字(0-9),也就是[0-9] 的簡寫 |
\D | 除了數字以外的字元 |
[ ] | 指定的範圍,例如[a-f] |
\A | 字串開始 |
\z | 字串結束 |
\b | 邊界 (boundary); 旁邊不可有其他文數字 |
\s | 空白(white space),等同 [ \t\r\n\f] |
\S | 非空白,等同 [^\t\r\n\f] |
^ | 一列之首 |
$ | 一列之尾 |
以上面的[]
為例[A-Z]
代表 A~Z,任何一個大寫字母
[a-z]
代表 a~z,任何一個小寫字母
指定字元是否重複,或者重複的次數,否則預設都是一個字元。
重複表示 | 規則 |
---|---|
? | 未出現或出現一次 |
* |
未出現或出現多次 |
+ |
出現一次或多次 |
{a} | 連續出現 a 次 |
{a,} | 連續至少出現 a 次以上 |
{,b} | 連續最多出現 b 次 |
{a,b} | 連續最少出現 a 次,最多出現 b 次 |
上面這些重複表示,要跟在字元後面
看完上面規則,應該還是不知道Regexp到底怎麼用,就像開頭的說的,來看code吧
# method 使用match或 scan
"string".method(/regexp/)
# 或反過來也可以
/regexp/.method("string")
例如美語味道的單字是flavor
,但是澳洲的味道是flavour
多個u
,如果我希望這兩個單字都對,可以這樣做
'flavor'.match(/flavou?r/) # => #<MatchData "flavor">
'flavour'.match(/flavou?r/) # => #<MatchData "flavour">
'flavr'.match(/flavou?r/) # => nil
如果符合,就回傳MatchData
實體,如果不符合,則回傳nil
@
前後各有一個字元
"1@c".match(/^.@+.$/) # => #<MatchData "1@c">
"1@yahoo".match(/^.@+.$/) # => nil
我們用到了
^
(一列之首).
(任意一個字元)+
(至少一個字元)$
(一列之尾)@
前後各有一個以上字元
"1111@yahoo".match(/^.+@{1,1}.+$/) # => #<MatchData "1111@yahoo">
"1111@yahoo.com".match(/^.+@{1,1}.+$/) # => #<MatchData "1111@yahoo.com">
"1111@yahoo.com.tw".match(/^.+@{1,1}.+$/) # => #<MatchData "1111@yahoo.com.tw">
前半部的^.+
代表開頭要一個以上字元
中間的@{1,1}
代表只能有ㄧ個@
後半部的.+$
代表結尾要一個以上字元
這樣算是可以勉強可用的email格式驗證
@
前後一個以上字元.
,且.
前後有一個以上字元.
可有可無,第二個.
後面的字元可有可無"Ithome30@yahoo.com.tw".match(/^[0-9a-z]+@{1,1}[0-9a-z]+$?\.*[0-9a-z]+\.*[0-9a-z]*$/)
# => nil
# 如果前面有大寫英文就會fail
#把大寫英文也考慮進去
"Ithome30@yahoo.com".match(/^[0-9a-zA-Z]+@{1,1}[0-9a-z]+$?\.*[0-9a-z]+\.*[0-9a-z]*$/)
# => #<MatchData "Ithome30@yahoo.com">
"Ithome30@yahoo.com.tw".match(/^[0-9a-zA-Z]+@{1,1}[0-9a-z]+$?\.*[0-9a-z]+\.*[0-9a-z]*$/)# => #<MatchData "Ithome30@yahoo.com.tw">
^[0-9a-z]* 這段則是找出整個字串中只有小寫字母跟數字,意思就是字串中完全沒有大寫的組合。
^[0-9a-zA-Z]* 這段則是找出整個字串中只有小寫字母,大寫字母跟數字
+
代表1個以上這樣又比初階版
再好一點
如果前端傳來的email不符合這個格式,可以回傳警告"email格式不符"
到前端
其實我的Rexexp不強,上面email驗證有更好的格式請再跟我說
第十天
達成一個小小里程碑(ˊᗜˋ*)
想起今年一月立下目標,每個月一篇技術文然後...就沒有...了
現在就像是還債,把今年該寫的都補上
還有20天,各位參賽者加油 ✧d(ʘ◡ʘ )