正則運算式也拼寫為 regexp
,它用於保存正則運算式,用於將模式與字串匹配。 在Ruby中,一個模式寫在正斜杠字元之間。 它們描述一個字串的內容。 Ruby正則運算式更類似於Perl正則運算式。
語法
/search string/
Ruby 1.9
使用Oniguruma正則運算式庫,但Ruby 2.0
使用Onigmo正則運算式庫。 Onigmo是Oniguruma的一個分支子庫,增加了一些新功能。
=~ 和 #match操作符
通過使用=~
和#match
操作符來實現模式匹配。
=~
這是基本的匹配模式,這裏使用兩個運算元。 一個是正則運算式,另一個是字串。 正則運算式與字串匹配。
如果找到匹配,則運算符返回第一個匹配索引,否則返回零(nil)。
示例:
F:\worksp\ruby>irb
irb(main):001:0> /yii/ =~ 'Hello, welcom to xuhuhu.com.'
=> 17
irb(main):002:0> /to/ =~ 'Hello, welcom to xuhuhu.com.'
=> 14
irb(main):003:0> /too/ =~ 'Hello, welcom to xuhuhu.com.'
=> nil
irb(main):004:0>
#match
該運算符返回匹配數據對象,否則返回零(nil)。
F:\worksp\ruby>irb
irb(main):001:0> /zaixian/.match('Ruby tutorial at xuhuhu.com')
=> #<MatchData "zaixian">
irb(main):002:0> /Ruby/.match('Ruby tutorial at xuhuhu.com')
=> #<MatchData "Ruby">
irb(main):003:0> /Py/.match('Ruby tutorial at xuhuhu.com')
=> nil
irb(main):004:0>
元字元和轉義
元字元在模式中具有特定含義。 要匹配一個字串,它們將被轉回(\
)或轉義。 一些元字元是(,),(.),(?),(+),( - ),(*),[,],{,}。否則返回匹配的字串。
示例:
F:\worksp\ruby>irb
<elcome to our site\./.match('Does Hello, welcome to our site.')
=> #<MatchData "Hello, welcome to our site.">
irb(main):003:0> /2 \* 2 \+ 3 \- 1 = \?/.match('Does 2 * 2 + 3 - 1 = ?')
=> #<MatchData "2 * 2 + 3 - 1 = ?">
irb(main):004:0> /2 * 2 + 3 - 1 = ?/.match('Does 2 * 2 + 3 - 1 = ?')
=> nil
irb(main):005:0>
字元類
元字元在模式中具有特定含義。 要匹配一個字串,它們將被轉回(\
)或轉義。
一個字元類被包圍在方括號內。
[ab]
這裏,[ab]
表示a
或b
。 與/ab/
相反,它表示a
和b
。
示例
F:\worksp\ruby>irb
irb(main):001:0> /j[afdvs]av/.match('java')
=> nil
irb(main):002:0> /j[afdvs]va/.match('java')
=> #<MatchData "java">
irb(main):003:0> /j[afdvs]va/.match('jpva')
=> nil
irb(main):004:0>
[a-d]
這裏,[a-d]
等同於[abcd]
。 連字元(-
)字元類表示字元的範圍。
示例
F:\worksp\ruby>irb
irb(main):001:0> /[a-ge-p]/.match('go')
=> #<MatchData "g">
irb(main):002:0> /[a-fe-p]/.match('go')
=> #<MatchData "g">
irb(main):003:0>
[^a-d]
^
符號表示範圍中不存在的任何其他字元。
示例
F:\worksp\ruby>irb
irb(main):001:0> /[^a-ge-p]/.match('go')
=> nil
irb(main):002:0> /[^a-ge-n]/.match('go')
=> #<MatchData "o">
irb(main):003:0> /[^a-fe-n]/.match('go')
=> #<MatchData "o">
irb(main):004:0> /[^a-fh-n]/.match('go')
=> #<MatchData "g">
irb(main):005:0>
重複
現在定義的字元與單個字元匹配。在重複元字元的幫助下,可以指定需要發生的次數。 這些元字元稱為量詞。
*
: 零次或多次+
: 一次或多次?
: 零次或一次(可選){n}
: 正好n
次{n, }
:n
次以上{,m}
:m
次以下{n,m}
: 至少n
和最多m
次
實例
irb(main):006:0> "SSSIT".match(/S{3}+[[:upper:]]+[[:upper:]]/)
=> #<MatchData "SSSIT">
irb(main):007:0>
irb(main):008:0*
irb(main):009:0* "zaixiancom".match(/[[:lower:]]+[[:upper:]]+com/)
=> nil
irb(main):010:0> "zaixiancom".match(/[[:lower:]]+[[:upper:]]+com/)
=> #<MatchData "zaixiancom">
irb(main):011:0>
分組
分組使用括弧將專案組合在一起。將這些術語分組成一個。
示例:
F:\worksp\ruby>irb
irb(main):001:0> /[aeiou]\w{2}/.match('family')
=> #<MatchData "ami">
irb(main):003:0> /([aeiou]\w){2}/.match('family')
=> #<MatchData "amil" 1:"il">
irb(main):004:0>
在這個例子中,第一個模式匹配一個母音,後跟兩個字元。
在第二種模式中,它匹配一個母音後跟一個字元,兩次。
(?:..)
此運算式提供分組而不捕獲。 它結合術語而不創建反向引用。
示例:
irb(main):006:0> /I(n)(de)pen\2\1tly/.match('independently')
=> nil
irb(main):007:0> /i(n)(de)pen\2\1tly/.match('independently')
=> #<MatchData "independently" 1:"n" 2:"de">
irb(main):009:0> /i(?:n)(de)pen\1ntly/.match('independently')
=> #<MatchData "independently" 1:"de">
irb(main):010:0>
上一篇:
Ruby面向對象
下一篇:
Ruby套接字編程(Socket)