ruby中Regexp用法

Regexp

正則表達式的類。正則表達式的字面值是以雙斜線內夾表達式的形式生成的。html

/^this is regexp/

還可使用Regexp.new(string)來動態地生成正則表達式對象。正則表達式

超類:

類方法:

Regexp.compile(string[, option[, code]])
Regexp.new(string[, option[, code]])

編譯string後生成並返回一個正則表達式對象。ruby

若第二參數是Fixnum的話,其值能夠任選下列中的若干項ui

若第二參數並不是Fixnum,則被看做是布爾值。若爲真(nil,false之外的值)的話,其效果等同於指定了Regexp::IGNORECASEthis

若指定了第三參數的話,進行匹配時將使用指定的字符編碼而不受$KCODE的影響。字符編碼只取決於字符串參數的首字符,這同給$KCODE賦值時的原則是一致的。編碼

若第一參數是正則表達式的話,將拷貝並返回一個內容相同(可是,上述標識的內容將被清楚)的正則表達式。此時將按照第2、第三參數的要求對複製的正則表達式進行設定。spa

ruby 1.8 特性:若第一參數爲正則表達式,則對其進行復制並返回複製結果。此時將忽略第2、第三參數的規定,但會出現警告。3d

若正則表達式的編譯失敗,則引起RegexpError異常。code

Regexp.escape(string[,kcode])
Regexp.quote(string[,kcode])

string中的「特殊字符」前面插入轉義字符(反斜線)後返回該字符串,這裏的「特殊字符」是指那些在正則表達式中具備特殊意義的字符。此時,以可選參數kcode來設定字符串的字符編碼(省略時使用$KCODE的值)。regexp

指定字符編碼的方法與$KCODE相同。

Regexp.last_match

返回當前範圍內的最後一次正則表達式匹配的MatchData對象。調用該方法與調用$~是同樣的。

/(.)(.)/ =~ "ab"
p Regexp.last_match      # => #<MatchData:0x4599e58>
p Regexp.last_match[0]   # => "ab"
p Regexp.last_match[1]   # => "a"
p Regexp.last_match[2]   # => "b"
p Regexp.last_match[3]   # => nil
Regexp.last_match([nth]) ((<ruby 1.7 特性>))

若整數nth爲0,則返回匹配的字符串($&)。除此之外,則返回與第nth個括號相匹配的部分字符串($1,$2,...)。若沒有相應的括號或未完成匹配,則返回nil。

/(.)(.)/ =~ "ab"
p Regexp.last_match      # => #<MatchData:0x4599e58>
p Regexp.last_match(0)   # => "ab"
p Regexp.last_match(1)   # => "a"
p Regexp.last_match(2)   # => "b"
p Regexp.last_match(3)   # => nil

若整個正則表達式都沒有成功匹配時,無參數的Regexp.last_match會返回nil,所以last_match[1]就會引起NameError異常。而last_match(1)卻返回nil

Regexp.union([pattern, ...]) ((<ruby 1.8 特性>)) version 1.8.1 之後

|將傳給參數的pattern連起來以後,以Regexp的形式將其返回。只要與其中的一個pattern相匹配,就意味着與Regexp相匹配。

p Regexp.union(/a/, /b/, /c/) #=> /(?-mix:a)|(?-mix:b)|(?-mix:c)/

pattern能夠是Regexp或String。如果String的話,則意味着要與該字符串自己相匹配,隨後該pattern將被歸入Regexp之中。

p Regexp.union("a", "?", "b") # => /a|\?|b/
p Regexp.union(/a/, "*") # => /(?-mix:a)|\*/

若沒有任何參數時,則返回一個絕對不會匹配的Regexp。

p Regexp.union() # => /(?!)/

最終返回的Regexp的字符編碼與傳給參數的Regexp的字符編碼相一致。若同時給出了若干個編譯過的固定編碼Regexp時,這些編碼必須一致。若存在不一樣編碼的Regexp時,將引起ArgumentError

p Regexp.union(/a/e, /b/e) # => /(?-mix:a)|(?-mix:b)/e
p Regexp.union(/a/e, /b/s) # => ArgumentError

若同時存在固定編碼Regexp和非固定編碼Regexp時,最終返回的Regexp的編碼以那個固定編碼爲準。

p Regexp.union(/a/e, /b/) # => /(?-mix:a)|(?-mix:b)/e

方法:

self =~ string
self === string

string字符串進行正則表達式的匹配操做。若匹配成功則返回匹配位置的索引(首位爲0)。若匹配失敗或者stringnil時,返回nil

內部變量$~中保存的是與匹配相關的信息。

string既非nil又非String對象時,引起TypeError異常。

ruby 1.7 特性:Regexp#=== 返回布爾值。若參數並不是字符串或匹配失敗則返回false,若匹配成功則返回true。

~ self

$_變量的值之間進行匹配操做。等同於

self =~ $_
casefold?

若編譯正則表達式時不區分大小寫,則返回真。

kcode

採用與$KCODE相同的形式返回編譯正則表達式時的字符編碼。若編譯正則表達式時沒有固定的編碼(使用匹配時的$KCODE的值)時,返回nil。

match(str)
match(str, [pos]) ((<ruby 1.9 特性>))

除去返回MatchData對象這點區別之外,它與self =~ str是相同的。匹配失敗時返回nil。

若只想獲得與正則表達式相匹配的部分字符串時,能夠

bar = /foo(.*)baz/.match("foobarbaz").to_a[1]

foo, bar, baz = /(foo)(bar)(baz)/.match("foobarbaz").to_a.indexes(1,2,3)

這樣。(之因此使用to_a是由於考慮到可能會出現匹配失敗的狀況。)

相關文章
相關標籤/搜索