iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
1
Software Development

Ruby 研究 30 天系列 第 26

Day 25 - 正規表示式

  • 分享至 

  • xImage
  •  

正規表示式

/[a-zA-z]{5,}|^\D$|^[a-z]*$|^[A-Z]*$|^\w{,6}$/

這或許是一般人學程式碼之前心裡所想像的程式碼,充滿新奇卻又讓人望之卻步,但在學了程式碼之後,特別是 Ruby 這種語法貼近英文的語言時,往往會覺得程式語言沒有這麼嚇人,不過,上述這行的確是程式碼,而且 Ruby 也的確會使用它,正確來說,許多程式語言都有這個東西。

這段程式碼叫做正規表示式 (Regular Expression,簡稱:RegExp),是處理文字非常重要的利器,當你希望找尋特定文字的格式時,正規表示式是不可或缺的存在。

在 Ruby 裡面,有幾種方式可以定義正規表示式:

  1. 用 slash / 將正規表示式包起來,像是 /[a-zA-Z]*/
  2. 用 Ruby 的 class 生成,如 Regexp.new('[a-zA-Z]*') ,而這種方式不需要加 slash,而是將內容以字串方式傳入即可。
  3. %r{[a-zA-Z]*} 的方式表達。

以下正規表示式的意思是:

/[a-zA-z]{5,}|^\D$|^[a-z]*$|^[A-Z]*$|^\w{,6}$/

  • [a-zA-z]{5,} 含有連續5個以上的大小寫英文字母
  • ^\D$ 整串沒有數字
  • ^[a-z]*$ 整串只有小寫字母
  • ^[A-Z]*$ 整串只有大寫字母
  • ^\w{,6}$ 整串字元少於或等於6

這裡整理一個表格給大家參考:
https://ithelp.ithome.com.tw/upload/images/20191122/20120823ALefu1QKdg.png

那什麼時候會用到它?

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

這裡我舉一個剛學 Ruby 時遇到的 Codewars lv7 的題目,當時的情境是,我查到了要用哪個表示法,不過我完全看不懂,所以就寫了個最陽春的方法:

# 幫信用卡打馬賽克
# maskify('4556364607935616') # should return '############5616'

def maskify(card_number)
  if card_number.length < 4
    card_number
  else
    "#{ '#' * (card_number.length - 4) }#{ card_number[-4, 4]}"
end

maskify('4556364607935616')
maskify('1')
maskify('11111')

#{ card_number[-4, 4]} 這段的意思是從倒數第 4 個位置開始取 4 個單位。

如果你會正規表示式,你可以改成如下寫法,如果你要代換的字不止一個,可以用 gsub 這個方法,這裡先提供 ruby-doc 的使用範例:

https://ithelp.ithome.com.tw/upload/images/20191122/20120823Xc4uklsT5K.png

def maskify(card_number)
  card_number.gsub(/.(?=....)/, '#')
end

這裡跟大家介紹一個網站 rubular,可以在上面試試你想要的結果如下:
https://imgur.com/a/VelKKoL

補充

這裡再補充一下上面取值的用法,不知道大家是否看過前面的「數字與字串」篇,來回顧一下:

puts "我是不是很可愛?"[-3..-2]   # 印出 可愛 
puts "我是不是很可愛?"[-3, 2]    # 印出 可愛

以上兩行程式碼雖然結果一樣,但是用法不同,這在新手時也有可能搞錯,大家不防試試。

此文同步刊登於CJ-Han的網站


上一篇
Day 24 - Super
下一篇
Day 26 - == , === , eql? , equal?
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言