ruby正則表達式學習

一、Regexp類的一些方法:

    Regexp.new/compile (string/regexp,[options,[lang]]) : 構造一個正則表達式對象。第一個參數是一個字符串或者正則表達式;第二個參數是 正則表達式修飾符的按位OR。

    Regexp.escape/quote (string) : 對正則表達式中的特殊字符進行轉義。如:

Regexp.escape('\\*?{}.')   #=> \\\\\*\?\{\}\.

 rxp.match (str) : 返回一個表示匹配結果的MatchData 對象。如果沒有匹配則返回nil

str = "a123b456c789"
refs = /(a\d+)(b\d+)(c\d+)/.match(str)
puts refs[0]   # "a123b456c789" 
puts refs[1,3]  # ["a123","b456","c789"]
refs.to_a.each {x| x}   # MatchData對象不是數組,在進行迭代前要調用to_a方法將其轉換爲一個數組。

 也可以使用全局變量$1,$2等引用匹配結果:

refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','b456','c789'

在sub、gsub等方法中, 不能使用$1等來引用結果,因爲這些參數在調用方法前就已經計算好。這時,可以採用特殊編碼\1,\2等:

refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','b456','c789'
"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, '1st=\1, 2nd=\2, 3rd=\3')   # 1st=a123, 2nd=b456, 3rd=c789
"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, "1st=\\1, 2nd=\\2, 3rd=\\3")   # 1st=a123, 2nd=b456, 3rd=c789
# 上面兩個sub方法中,第一個使用的是單引號;第二個是雙引號,需要使用雙語義

MatchData對象還有以下一些有用的方法:

1. begin(n) : 返回第n個匹配開頭的偏移量

2. end(n) : 返回第n個匹配結束的偏移量(等於第n+1個匹配的開頭偏移量)

3. offset(n) : 返回一個包含第n個匹配開頭和結束偏移量的數組

4. pre_match : 返回匹配子字符串前面的字符串部分

5. post_match : 返回匹配子字符串後面的字符串部分

 

 

二、一些常用的標記

1.  ^$   : 行或字符串開頭/結尾(注意:匹配單行的行頭/行尾)。

src = "abc\ndef\nghi"
/^abc/ =~ src  #0
/^def/ =~ src   #4
/def$/ =~ src   #4
/ghi$/ =~ src  #8

2. \A\Z : 整個字符串的開頭/末尾或最後的換行符前

     \z : 基本同 \Z,但是不能匹配最後的換行符

src = "abc\ndef\nghi"
/\Aabc/ =~ src  #0
/\Adef/ =~ src   #nil
/def\Z/ =~ src   #nil
/ghi\Z/ =~ src  #8
/ghi\z/ =~ src  #8
src << "\n"
/ghi\Z/ =~ src  #8
/ghi\z/ =~ src  #nil

3. \b : 單詞邊界(在[]外); \B : 非單詞邊界

src = "this is a test"
src.gsub(/\b/, '|')  # "|this| |is| |a| |test|"
src.gsub(/\B/, '-')  # "t-h-i-s i-s a t-e-s-t"

4. {?=} : 正預查 ,當匹配子字符串sub後面接着的字符串與預查中=號後面的字符串匹配時,sub才匹配成功;{?!}: 負預查,當匹配子字符串sub後面接着的字符串與預查中=號後面的字符串不匹配時,sub才匹配成功。

/(a\d+)(?=b)(b\d+)(c\d+)/.match("a123b456c789")    # ['a123','b456','c789']
 /(a\d+)(?=c)(b\d+)(c\d+)/.match("a123b456c789")    # nil
 /(a\d+)(?=b)(\d+)(c\d+)/.match("a123b456c789")     # nil

 /(a\d+)(?!c)(b\d+)(c\d+)/.match("a123b456c789")    # ['a123','b456','c789'

5. () : 子表達式編組; (?:) : 非捕獲組

refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','b456','c789'

refs = /(a\d+)(?:b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','c789','nil'

6. 字符類:包括在方括號[]中的一組字符,其中每一個子匹配是任意一個字符。

    (1) ^用於字符類的開頭時有特殊意義,它對字符列表取反。

    (2) 像.和?之類的元字符在字符類中沒有特殊含義,表示自身代表的字符。而\n這樣的轉義序列仍然有效。

    (3) 連字符-用於字符類的開頭或結尾,脫字符^用於字符類的中間時,沒有特殊含義,只表示自身;左括號[和右括號]用於字符類中時,也是如此,而且還必須顯示進行轉義。

/[abc]/ =~ "abcd"   #0
/[^abc]/ =~ "abcd"   #3

/[.?abc]/ =~ ".?"   #0

/[-^\[\]]/ =~ "^" #0

       7. 幾個修飾符的介紹

           (1) i    :  正則表達式不區分大小寫

           (2) :  只執行一次表達式替換

           (3) m   :  多行模式(句點匹配換行)

           (4) x    :  擴展正則表達式(允許空白、註釋)

 

 

三、一些常用正則表達式實例

1. 匹配IP地址

num = /\d|[01]?\d\d|2[0-4]\d|25[0-5]/
ip = /^(#{num}\.){3}#{num}$/

ip =~ '192.168.0.50'  # 0
ip =~ '192.168.0.500'  # nil

2. 匹配email地址

before_at = /([a-zA-Z0-9]+(_?[a-zA-Z0-9])+)/
after_at = /[a-zA-Z]+(-?[a-zA-Z])+(\.[a-zA-Z]+)+/
email = /^(#{before_at}@#{after_at})$/

email =~ '[email protected]' #0
email =~ '[email protected]' #0
email =~ '[email protected]' #nil
email =~ '[email protected]' #0
email =~ '[email protected]' #nil

3. 匹配時間/日期類型(yyyy.mm.dd hh:mm:ss)

yyyy = /[1-9]\d\d\d/
mm = /0?[1-9]|1[12]/
dd = /0?[1-9]|[12]\d|3[01]/
hh = /[01]?[1-9]|2[0-4]/
MM = /[0-5]\d/
ss = /[0-5]\d/
date_time = /^(#{yyyy}\.#{mm}\.#{dd}) (#{hh}:#{MM}:#{ss})$/

date_time =~ '2008.8.27 22:12:10'  # 0
date_time =~ '2008.8.27 22:12:60'  # nil

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章