Ruby正则表达式

正则表达式也拼写为 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]表示ab。 与/ab/相反,它表示ab

示例

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)