正規表示式
正規表示式在很多場景都適用。例如,驗證字串是否匹配格式,查詢匹配的字串,替換匹配的字串。
很多程式語言都支援正規表示式,語法也相近。
正規表示式由兩部分組成:模式和匹配字串。
通常我們說的寫一個正規表示式,就是寫一個模式。然後驗證一些輸入的字串是否匹配這個模式。
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/
,代表一個空白字元,[
f]/。 - /S/
,代表一個非空白字元,[^
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