
簡稱 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(ʘ◡ʘ )