iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
0
Modern Web

關於 Ruby on Rails,我想說的是系列 第 10

[Day 10] 字串魔法師 - 正規表達式 RegExp

  • 分享至 

  • xImage
  •  

正規表達式 Regular Expressions

簡稱 regexp 或 RE,可以把它想長是字串的規範,只要學會就可以輕鬆代換或搜尋文字,常用在表單輸入後的驗證。
例如,電商網站常常需要輸入email電話email會希望@前後都有字串,電話希望前兩位是09,總共有十位數字,諸如此類需要字串判斷的,都可以用 RegExp ,今天介紹一些常用的形式給大家。

Regexp通常會被包在兩個斜線(slash)/…/ 或是用%r{…}也可以。

問:那Regexp在Ruby裡面是什麼? 也是物件嗎?

答:是一個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


email的驗證

1.簡單版

@前後各有一個字元

"1@c".match(/^.@+.$/) # => #<MatchData "1@c"> 
"1@yahoo".match(/^.@+.$/) # => nil 

我們用到了

  • ^ (一列之首)
  • . (任意一個字元)
  • + (至少一個字元)
  • $ (一列之尾)

2.初階版

@前後各有一個以上字元

"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格式驗證

3.進階版

條件:
  • @前後一個以上字元
  • 後面要有.,且.前後有一個以上字元
  • 第二個.可有可無,第二個.後面的字元可有可無
"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(ʘ◡ʘ )


上一篇
[Day 9] 檔案操作 File,Dir,FileUtils(下)
下一篇
[Day 11] MVC 架構
系列文
關於 Ruby on Rails,我想說的是23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言