Ruby - 正則表示式
正則表示式 是一種特殊的字元序列,它使用專門的語法(包含在模式中)來幫助你匹配或查詢其他字串或字串集。
正則表示式字面量 是在斜槓之間或在任意分隔符之間的模式,後跟 %r,如下所示:
語法
/pattern/
/pattern/im # option can be specified
%r!/usr/local! # general delimited regular expression
示例
#!/usr/bin/ruby
line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";
if ( line1 =~ /Cats(.*)/ )
puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
puts "Line2 contains Dogs"
end
這將產生以下結果:
Line1 contains Cats
正則表示式修飾符
正則表示式字面量可以包含一個可選的修飾符來控制匹配的各個方面。修飾符在第二個斜槓字元之後指定,如前所述,可以用以下字元之一表示:
序號
修飾符及描述
1
i
匹配文字時忽略大小寫。
2
o
僅執行一次 #{} 插值,即在第一次評估正則表示式字面量時執行。
3
x
忽略空格並在正則表示式中允許註釋。
4
m
匹配多行,將換行符識別為普通字元。
5
u,e,s,n
將正則表示式解釋為 Unicode(UTF-8)、EUC、SJIS 或 ASCII。如果未指定這些修飾符中的任何一個,則正則表示式假定使用源編碼。
類似於用 %Q 分隔的字串字面量,Ruby 允許你用 %r 後跟任意分隔符開始正則表示式。當你要描述的模式包含許多你不希望轉義的正斜槓字元時,這很有用:
# Following matches a single slash character, no escape required
%r|/|
# Flag characters are allowed with this syntax, too
%r[</(.*)>]i
正則表示式模式
除了控制字元(+ ? . * ^ $ ( ) [ ] { } | \) 之外,所有字元都匹配自身。你可以透過在控制字元前面加上反斜槓來轉義它。
下表列出了 Ruby 中可用的正則表示式語法。
序號
模式及描述
1
^
匹配行首。
2
$
匹配行尾。
3
.
匹配除換行符之外的任何單個字元。使用 m 選項允許它匹配換行符。
4
[...]
匹配括號中任何單個字元。
5
[^...]
匹配括號中任何單個字元之外的任何字元
6
re*
匹配前一個表示式的 0 個或多個出現。
7
re+
匹配前一個表示式的 1 個或多個出現。
8
re?
匹配前一個表示式的 0 個或 1 個出現。
9
re{ n}
匹配前一個表示式的正好 n 個出現。
10
re{ n,}
匹配前一個表示式的 n 個或更多出現。
11
re{ n, m}
匹配前一個表示式的至少 n 個至多 m 個出現。
12
a| b
匹配 a 或 b。
13
(re)
對正則表示式進行分組並記住匹配的文字。
14
(?imx)
在正則表示式中臨時開啟 i、m 或 x 選項。如果在括號內,則僅受該區域影響。
15
(?-imx)
在正則表示式中臨時關閉 i、m 或 x 選項。如果在括號內,則僅受該區域影響。
16
(?: re)
對正則表示式進行分組而不記住匹配的文字。
17
(?imx: re)
在括號內臨時開啟 i、m 或 x 選項。
18
(?-imx: re)
在括號內臨時關閉 i、m 或 x 選項。
19
(?#...)
註釋。
20
(?= re)
使用模式指定位置。沒有範圍。
21
(?! re)
使用模式否定指定位置。沒有範圍。
22
(?> re)
匹配不回溯的獨立模式。
23
\w
匹配單詞字元。
24
\W
匹配非單詞字元。
25
\s
匹配空格。等效於 [\t\n\r\f]。
26
\S
匹配非空格。
27
\d
匹配數字。等效於 [0-9]。
28
\D
匹配非數字。
29
\A
匹配字串開頭。
30
\Z
匹配字串結尾。如果存在換行符,則匹配換行符之前。
31
\z
匹配字串結尾。
32
\G
匹配上次匹配結束的位置。
33
\b
在括號外匹配單詞邊界。在括號內匹配退格鍵 (0x08)。
34
\B
匹配非單詞邊界。
35
\n, \t, etc.
匹配換行符、回車符、製表符等。
36
\1...\9
匹配第 n 個分組的子表示式。
37
\10
如果第 n 個分組的子表示式已匹配,則匹配它。否則,引用字元程式碼的八進位制表示形式。
正則表示式示例
字面量字元
序號
示例及描述
1
/ruby/
匹配“ruby”。
2
¥
匹配日元符號。Ruby 1.9 和 Ruby 1.8 支援多位元組字元。
字元類
序號
示例及描述
1
/[Rr]uby/
匹配“Ruby”或“ruby”。
2
/rub[ye]/
匹配“ruby”或“rube”。
3
/[aeiou]/
匹配任何一個小寫母音。
4
/[0-9]/
匹配任何數字;與 /[0123456789]/ 相同。
5
/[a-z]/
匹配任何小寫 ASCII 字母。
6
/[A-Z]/
匹配任何大寫 ASCII 字母。
7
/[a-zA-Z0-9]/
匹配以上任何一個。
8
/[^aeiou]/
匹配除小寫母音之外的任何字元。
9
/[^0-9]/
匹配除數字之外的任何字元。
特殊字元類
序號
示例及描述
1
/./
匹配除換行符之外的任何字元。
2
/./m
在多行模式下,也匹配換行符。
3
/\d/
匹配數字:/[0-9]/。
4
/\D/
匹配非數字:/[^0-9]/。
5
/\s/
匹配空格字元:/[ \t\r\n\f]/。
6
/\S/
匹配非空格:/[^ \t\r\n\f]/。
7
/\w/
匹配單個單詞字元:/[A-Za-z0-9_]/。
8
/\W/
匹配非單詞字元:/[^A-Za-z0-9_]/。
重複情況
序號
示例及描述
1
/ruby?/
匹配“rub”或“ruby”:y 是可選的。
2
/ruby*/
匹配“rub”加上 0 個或多個 y。
3
/ruby+/
匹配“rub”加上 1 個或多個 y。
4
/\d{3}/
匹配正好 3 個數字。
5
/\d{3,}/
匹配 3 個或更多數字。
6
/\d{3,5}/
匹配 3、4 或 5 個數字。
非貪婪重複
這匹配最少的重複次數:
序號
示例及描述
1
/<.*>/
貪婪重複:匹配“<ruby>perl>”。
2
/<.*?>/
非貪婪:匹配“<ruby>”中的“<ruby>perl>”。
用括號分組
序號
示例及描述
1
/\D\d+/
無分組:+ 重複 \d
2
/(\D\d)+/
分組:+ 重複 \D\d 對
3
/([Rr]uby(, )?)+/
匹配“Ruby”、“Ruby, ruby, ruby”等。
反向引用
這再次匹配先前匹配的組:
序號
示例及描述
1
/([Rr])uby&\1ails/
匹配 ruby&rails 或 Ruby&Rails。
2
/(['"])(?:(?!\1).)*\1/
單引號或雙引號字串。\1 匹配第一個組匹配的內容。\2 匹配第二個組匹配的內容,依此類推。
備選方案
序號
示例及描述
1
/ruby|rube/
匹配“ruby”或“rube”。
2
/rub(y|le))/
匹配“ruby”或“ruble”。
3
/ruby(!+|\?)/
“ruby”後跟一個或多個 ! 或一個 ?
錨點
它需要指定匹配位置。
序號
示例及描述
1
/^Ruby/
匹配字串或內部行開頭的“Ruby”。
2
/Ruby$/
匹配字串或行結尾的“Ruby”。
3
/\ARuby/
匹配字串開頭的“Ruby”。
4
/Ruby\Z/
匹配字串結尾的“Ruby”。
5
/\bRuby\b/
匹配單詞邊界的“Ruby”。
6
/\brub\B/
\B 是非單詞邊界:匹配“rube”和“ruby”中的“rub”,但不能單獨匹配。
7
/Ruby(?=!)/
匹配“Ruby”,如果後面跟著感嘆號。
8
/Ruby(?!!)/
匹配“Ruby”,如果不後面跟著感嘆號。
帶括號的特殊語法
序號
示例及描述
1
/R(?#comment)/
匹配“R”。其餘部分為註釋。
2
/R(?i)uby/
匹配“uby”時不區分大小寫。
3
/R(?i:uby)/
與上面相同。
4
/rub(?:y|le))/
僅分組,不建立 \1 反向引用。
搜尋和替換
一些使用正則表示式的最重要的 String 方法是sub 和gsub ,以及它們的就地變體sub! 和gsub! 。
所有這些方法都使用 Regexp 模式執行搜尋和替換操作。sub & sub! 替換模式的第一次出現,而gsub & gsub! 替換所有出現。
sub 和gsub 返回一個新字串,而原始字串保持不變,而sub! 和gsub! 修改其呼叫的字串。
以下是一個示例:
#!/usr/bin/ruby
phone = "2004-959-559 #This is Phone Number"
# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")
puts "Phone Num : #{phone}"
# Remove anything other than digits
phone = phone.gsub!(/\D/, "")
puts "Phone Num : #{phone}"
這將產生以下結果:
Phone Num : 2004-959-559
Phone Num : 2004959559
以下是另一個示例:
#!/usr/bin/ruby
text = "rails are rails, really good Ruby on Rails"
# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")
# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"
這將產生以下結果:
Rails are Rails, really good Ruby on Rails