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