Ruby 正則表達式
正則表達式是使用一串字符來匹配一系列符合某個語法規則的字符串,通常被用于檢索和替換符合模式的文字。本章節中我們講學習在 Ruby 中如何使用正則表達式。
1. 創建正則表達式
在 Ruby 中,我們在兩個/
之間定義正則表達式,最簡單的正則表達式匹配一個單詞或者一個字符串。
實例:
> /a/.class
=> Regexp
我們還可以使用Regexp
類將字符串實例化為正則對象。
實例:
> regexp = Regexp.new("a")
=> /a/
除了上述方法還可以使用%r[]
實例:
> regexp = %r{\w+}
=> /\w+/
2. 如何使用正則表達式
2.1 匹配一個字符或一組字符
我們通常使用=~
來進行字符串和正則表達式的匹配,正則表達式中寫出我們需要匹配的字符或字符串即可。
實例:
'Hello World' =~ /Hello/
# ---- 輸出結果 ----
0
解釋:之所以結果返回0,是因為在字符串0索引找到該單詞Hello
(返回該單詞首次出現的索引)。
那如果字符串不能匹配正則呢?
那將返回nil
。
實例:
'Hello World' =~ /Hi/
# ---- 輸出結果 ----
nil
Tips:
=~
返回nil或者匹配的第一個索引。
檢查字符串是否匹配正則的第二種方式是使用match
。
實例:
if "Hello World".match?(/Hello/)
puts "Match found!"
end
# ---- 輸出結果 ----
Match found!
Tips:match?是2.4之后才有的方法,返回true或false,2.4之下只有match方法,返回MatchData對象。
2.2 匹配指定幾個字符或范圍字符
我們使用[]
,來匹配幾個指定字符或者范圍的字符。
匹配所有帶a、b、c的字符串。
實例:
def contains_abc(str)
str =~ /[abc]/
end
contains_abc('test')
contains_abc('bell')
contains_abc('apple')
# ---- 輸出結果 ----
nil
0
0
匹配a~c的所有字符(abc)。
實例:
def contains_abc(str)
str =~ /[a-c]/
end
contains_abc('test')
contains_abc('bell')
contains_abc('apple')
# ---- 輸出結果 ----
nil
0
0
解釋:上述的例子表示,[a-c]
和[abc]
代表一樣的內容。
Tips:同樣的[1-5]也代表[12345]。
另外我們還有一個取反的操作。使用^
。
實例:
def contains_abc(str)
str =~ /[^a-c]/
end
contains_abc('test')
contains_abc('bell')
contains_abc('apple')
# ---- 輸出結果 ----
0
1
1
解釋:test第一個字符是t,符合不是a、b、c的正則所以返回索引0,bell的第一個字符b不匹配正則,而e匹配,所以返回索引1,apple的第一個字符a不匹配正則,p匹配,所以返回1。
這些是常用匹配范圍字符的正則:
方法 | 時機簡介(調用的時機) |
---|---|
\w | 同:[0-9a-zA-Z_] |
\d | 同:[0-9] |
\s | 同:匹配空格、制表符、換行符。 |
\W | 同:[^0-9a-zA-Z_] |
\D | 同:[^0-9] |
\S | 同:不是空格、制表符、換行符。 |
. | 可以匹配任意字符。 |
.
可以匹配任意字符,\.
僅可以匹配.
字符。
實例:
p "6b6" =~ /\d.\d/
p "6b6" =~ /\d\.\d/
p "6.6" =~ /\d\.\d/
# ---- 輸出結果 ----
0
nil
0
2.3 一次匹配多個字符
上述正則只能讓我們一次匹配一個字符,現在讓我們來匹配多個字符。
需要使用的模式修飾符如下:
正則 | 匹配內容 |
---|---|
+ | 一個或多個 |
* | 0個或多個 |
? | 0個或1個 |
{2,4} | 2~4之間 |
比如現在要判斷一個字符串數字是否由均為數字組成。
實例:
'10000' =~ /^\d+$/
'9999a' =~ /^\d+$/
# ---- 輸出結果 ----
0
nil
解釋:\d+
匹配一個或多個字符串,而^
和$
分別匹配開頭和結尾。
Tips:如果要嚴格匹配字符串的開頭而不是僅在每一行(在\n之后)匹配,則需要使用\A和\Z而不是^和$。
如果字符數量確認,比如4個字符,可以使用/\d\d\d\d/
或者/\d{4}/
。
實例:
'word' =~ /\w\w\w\w/
'word' =~ /\w{4}/
# ---- 輸出結果 ----
0
0
2.4 使用長正則
我們使用%r{}x
來對長正則增加換行以及注釋操作,使之閱讀起來更簡單。
實例:
IP_FORMAT = %r{
^\d{1,3} # 1
\.
\d{1,3} # 2
\.
\d{1,3} # 3
\.
\d{1,3}$ # 4
}x
str = "192.168.1.1"
p str =~ IP_FORMAT
# ---- 輸出結果 ----
0
3. 正則表達式選項
在 Ruby 中我們可以在正則中添加一些選項,改變正則的行為。
選項 | 時機簡介(調用的時機) |
---|---|
i | 正則表達式不區分大小寫 |
m | 點匹配換行符 |
x | 忽略空格 |
要使用這些選項要在正則表達式結束后在末尾添加選項字母。
實例:
> "abc".match?(/[A-Z]/i)
=> true
4. 正則和 Ruby 的方法一起使用
正則可以和 Ruby 的許多方法一起使用,在這里舉幾個例子。
與scan
一起使用。
實例:
> "Hello World".scan(/\w+/)
=> ["Hello", "World"]
解釋:匹配到了字符串中所有的單詞,并生成了一個數組。
和gsub
一起使用。
實例:
> "hello world".gsub(/\w+/) {|w|w.capitalize}
=> "Hello World"
匹配郵箱格式是否正確。
實例:
> email = "[email protected]"
> !!(email=~ /\A[\w.+-]+@\w+\.\w+\z/)
=> true
Tips:這里
!!
將結果轉換成了布爾值。
4. 小結
本章節中我們學會了如何去創建一個正則,使用正則來匹配一個或多個字符,了解了正則表達式的寫法以及正則和Ruby方法的應用,在實際情況中大家要多多嘗試使用正則,會極大提高自己的編程水平。