Regex
Regex在很多情境都適用。例如,驗證字串是否匹配格式,尋找匹配的字串,替換匹配的字串。
很多程式設計語言都支援Regex,文法也相近。
Regex由兩部分組成:模式和匹配字串。
通常我們說的寫一個Regex,就是寫一個模式。然後驗證一些輸入的字串是否匹配這個模式。
Regexp
在ruby中模式叫做Regexp。用/.../或者%r(...)包起來的內容就是這個Regexp。
例如
- /regexp/
- %r(regexp)
haystack中包含y,所以他們就匹配了。
- /y/.match('haystack') #=> #<MatchData "y">
haystack中不包含needle,所以就不匹配,返回nil。
- /needle/.match('haystack') #=> nil
haystack中包含hay,所以就匹配。
- /hay/.match('haystack') #=> #<MatchData "hay">
Metacharacters and Escapes
字元(
, )
, [
, ]
, {
, }
, .
, ?
, +
, *
都是元字元,在模式中特殊的含義,如果想要匹配這些字串的,需要在它們前面加上反斜線\,使得這些特殊字元從模式中escape,代表普通的字元。
- /1 \+ 2 = 3\?/.match('Does 1 + 2 = 3?') #=> #<MatchData "1 + 2 = 3?">
ruby運算式也可以嵌入到模式中,只要寫在#{...}中就可以。
- place = "東京都"
- /#{place}/.match("Go to 東京都")
- #=> #<MatchData "東京都">
Character Classes
用[]括起來的一些字元,看他們是否在match中出現。/[ab]/代表a或b,/ab/代表a後面要跟著b。
- /W[aeiou]rd/.match("Word") #=> #<MatchData "Word">
用-串連的兩個字元,代表一個範圍,[a-d]和[abcd]是一個意思。
[]中可以包含多個範圍[a-dx-z]和[abcdxyz]是一個意思。
- /[0-9a-f]/.match('9f') #=> #<MatchData "9">
- /[9f]/.match('9f') #=> #<MatchData "9">
^代表相反的意思,就是除了模式中^後面的內容。
- /[^a-eg-z]/.match('f') #=> #<MatchData "f">
- /./,代表任一字元,新行除外。
- /./m,代表任一字元,m代表可以匹配多行。
- /\w/,代表一個字元,[a-zA-Z0-9]。
- /\W/,代表一個非字元,[^a-zA-Z0-9]。
- /\d/,代表一個數字,[0-9]。
- /\D/,代表一個非數字,[^0-9]。
- /\h/,代表一個十六進位字元,[0-9a-fA-F]。
- /\H/,代表一個非十六進位字元,[^0-9a-fA-F]。
- /\s/
,代表一個空白字元,[ \t\r\n\f]/。
- /\S/
,代表一個非空白字元,[^ \t\r\n\f]/。
Repetition重複
重複符號可以指明字元重複的次數。
-
*
- 0次或多次。
-
+
- 1次或多次。
-
?
- 0次或多次。
-
{
n}
- n次。
-
{
n,}
- n次或更多。
-
{,
m}
- m次或更少。
{
n,
m}
- 最少n次,最多m次。
重複預設是貪婪的,它會儘力向後匹配,匹配更多的內容。懶惰匹配只找到最近的匹配字串,只做最少量的匹配。
通過添加?就可以使貪婪變成懶惰。
- /<.+>/.match("<a><b>") #=> #<MatchData "<a><b>">
- /<.+?>/.match("<a><b>") #=> #<MatchData "<a>">
參考文獻
1.Regexp
2.SEO需要掌握的Regex
本文出自 “突破中的IT結構師” 部落格,請務必保留此出處http://virusswb.blog.51cto.com/115214/1043505