正規表示式

正規表示式在很多場景都適用。例如,驗證字串是否匹配格式,查詢匹配的字串,替換匹配的字串。

很多程式語言都支援正規表示式,語法也相近。

正規表示式由兩部分組成:模式和匹配字串。

通常我們說的寫一個正規表示式,就是寫一個模式。然後驗證一些輸入的字串是否匹配這個模式。

 

Regexp

在ruby中模式叫做Regexp。用/…/或者%r(…)包起來的內容就是這個Regexp。

例如

  1. /regexp/ 
  2. %r(regexp) 

haystack中包含y,所以他們就匹配了。

  1. /y/.match(`haystack`) #=> #<MatchData "y"> 

haystack中不包含needle,所以就不匹配,返回nil。

  1. /needle/.match(`haystack`) #=> nil 

haystack中包含hay,所以就匹配。

  1. /hay/.match(`haystack`)    #=> #<MatchData "hay"> 

 

Metacharacters and Escapes

字元(, ), [, ], {, }, ., ?, +, *都是元字元,在模式中特殊的含義,如果想要匹配這些字串的,需要在它們前面加上反斜槓,使得這些特殊字元從模式中escape,代表普通的字元。

  1. /1 + 2 = 3?/.match(`Does 1 + 2 = 3?`) #=> #<MatchData "1 + 2 = 3?"> 

ruby表示式也可以嵌入到模式中,只要寫在#{…}中就可以。

  1. place = "東京都" 
  2. /#{place}/.match("Go to 東京都") 
  3.     #=> #<MatchData "東京都"> 

 

Character Classes

用[]括起來的一些字元,看他們是否在match中出現。/[ab]/代表a或b,/ab/代表a後面要跟著b。

  1. /W[aeiou]rd/.match("Word") #=> #<MatchData "Word"> 

用-連線的兩個字元,代表一個範圍,[a-d]和[abcd]是一個意思。

[]中可以包含多個範圍[a-dx-z]和[abcdxyz]是一個意思。

  1. /[0-9a-f]/.match(`9f`) #=> #<MatchData "9"> 
  2. /[9f]/.match(`9f`)     #=> #<MatchData "9"> 

^代表相反的意思,就是除了模式中^後面的內容。

  1. /[^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次。

重複預設是貪婪的,它會盡力向後匹配,匹配更多的內容。懶惰匹配只找到最近的匹配字串,只做最少量的匹配。

通過新增?就可以使貪婪變成懶惰。

  1. /<.+>/.match("<a><b>")  #=> #<MatchData "<a><b>"> 
  2. /<.+?>/.match("<a><b>") #=> #<MatchData "<a>"> 

 

 

 

參考文獻

1.Regexp

2.SEO需要掌握的正規表示式