Ruby正则表达式

  • 22
  • 热度19,348 度
  • A+
所属分类:ruby

Ruby正则表达式

正则表达式的写法

一般的创建正则表达式方式:

  • /模式/

如果正则模式中含有/时,也可以采用下面的方式创建正则表达式:

  • %r(模式)
  • %r<模式>
  • %r|模式|
  • %r!模式!
  • %r{模式}

也可以使用类方法来创建正则表达式对象:

  • Regexp.new("模式")

模式匹配的写法

  • 正则表达式=~字符串

匹配失败时返回nil,成功匹配则返回该字符串起始字符的位置

普通字符匹配

当模式种不存在特殊意义的字符时,则进行普通字符匹配

普通字符匹配的例子

模式 字符串 匹配部分
/test/ "test" "test"
/test/ "mytest" "mytest"
/test/ "testtest" "testtest"
/test/ "tes1t" 不匹配
/test/ "te" 不匹配
/test/ "TEST" 不匹配

行首与行尾匹配

  • ^表示匹配行首
  • $表示匹配行尾

Ruby 的字符串,也就是 String 对象,所谓的“行”就是用换行符 (\n) 间隔的字符串。因此模式 /^test/ 也可以匹配字符串 "1234\ntest"。

字符串开头与末尾匹配

  • \A表示匹配字符串的开头
  • \z表示匹配字符串的末尾
  • \Z表示匹配字符串的末尾(如果末尾是换行符则匹配换行符前一个字符)(慎用)
irb(main):009:0> p "abc\n".gsub(/\z/, "!")
"abc\n!"
=> "abc\n!"
irb(main):010:0> p "abc\n".gsub(/\Z/, "!")
"abc!\n!"
=> "abc!\n!"

[]指定字符范围匹配

指定匹配某字符集中的1个字符时,可以采用[字符集]的形式。

  • 配合-可以方便的指定一个范围。
  • 配合^可以表示指定字符以外的字符。
示例 说明
[AB] 匹配A或B
[ABC] 匹配A或B或C
[BCA] 同上(与[]中顺序无关)
[A-Z] 匹配从A到Z的全部大写英文字母
[a-z] 匹配从a到z的全部小写英文字母
[A-Za-z] 匹配全部英文字母
[-ABC] 匹配-或A或B或C(-表示单纯的字符时,需写在模式的开头或者末尾)
[^ABC] 匹配A、B、C以外的字符(^需要写在[]的开头)
[^a-z] 匹配a到z以外的字符

匹配任意字符

使用*可以匹配任意一个字符。

示例 说明
/^...$/ 匹配字符数为3的行。

使用反斜杠的模式

  • \s表示匹配空白符(空格(0x20)、制表符(Tab)、换行符、换页符)
  • \d表示匹配0到9的数字
  • \w表示匹配英文字母和数字
  • \A表示匹配字符串的开头
  • \A表示匹配字符串的开头
  • \z表示匹配字符串的末尾
  • 元字符转义(在元字符前添加\使元字符变成普通字符)

重复

  • *表示重复0次以上
  • +表示重复1次以上
  • ?表示重复0次或1次

*和+会匹配尽可能多的字符,也称为贪婪匹配。

最短匹配

  • *?表示匹配0次以上的重复中最短的部分
  • +?表示匹配1次以上的重复中最短的部分

匹配尽可能少的字符,也称为懒惰匹配。

通过使用()与重复相结合,还可以重复匹配多个字符。

模式 字符串 匹配部分
/^(ABC)*$/ "ABC" "ABC"
/^(ABC)*$/ "" ""
/^(ABC)*$/ "ABCABC" "ABCABC"
/^(ABC)*$/ "ABCABCAB" 不匹配

选择

  • |表示在几个候选模式中匹配任意一个
模式 字符串 匹配部分
/^(ABC|DEF)$/ "ABC" "ABC"
/^(AB|CD)+$/ "ABCD" "ABCD"

quote方法

使用Regexp对象的quote方法,可以转义正则表达式中的所有元字符。

re1 = Regexp.new("abc*def")
re2 = Regexp.new(Regexp.quote("abc*def"))
p (re1 =~ "abc*def") #=> nil
p (re2 =~ "abc*def") #=> 0

正则表达式的选项

正则表达式选项的写法:

  • /模式/选项
  • /模式/选项1选项2选项...
  • Regexp.new(模式, 选项常量)
  • Regexp.new(模式, 选项常量1 | 选项常量2 | ...)
选项 选项常量 说明
i Regexp::IGNORECASE 表示忽略英文字母大小写
x Regexp::EXTENDED 表示忽略正则表达式中的空白字符以及#后面的字符(指定该选项后,我们可以使用#在正则表达式中写注释)
m Regexp::MULTILINE 表示允许使用.匹配换行符
o 表示只使用一次内嵌表达式

写法示例:

/DEF.GHI/i
/DEF.GHI/im
Regexp.new("ABC", Regexp::IGNORECASE)
Regexp.new("ABC", Regexp::IGNORECASE | Regexp::MULTILINE)

捕获

所谓捕获,就是从正则表达式的匹配部分中提取其中的某部分。通过“$ 数字”这种形式的变量,就可以获取匹配了正则表达式中的用 () 括住的部分的字符串。另外,我们也可以使用(?:)过滤不需要捕获的模式。

/(.)(\d\d)+(.)/ =~ "123456"
p $1 #=> "1"
p $2 #=> "45"
p $3 #=> "6"

/(.)(?:\d\d)+(.)/ =~ "123456"
p $1 #=> "1"
p $2 #=> "6"
  • $`表示获取匹配部分前的字符串
  • $&表示获取匹配部分的字符串
  • $'表示获取匹配部分后的字符串
/C./ =~ "ABCDEF"
p $` #=> "AB"
p $& #=> "CD"
p $' #=> "EF"

正则表达式的方法

方法名 方法说明 参数说明
sub 用指定字符替换字符串中首次匹配的部分 参数1为正则表达式的模式,参数2为用于替换的字符
gsub 用指定字符替换字符串中所有匹配的部分 同上
scan 获取匹配部分的字符,但不做置换操作 参数为正则表达式的模式

sub和gsub示例:

str = "abc def g hi"
p str.sub(/\s+/,' ') #=> "abc def g hi"
p str.gsub(/\s+/,' ') #=> "abc def g hi"

str = "abracatabra"
nstr = str.sub(/.a/) do |matched|
    '<'+matched.upcase+'>'
end
p nstr #=> "ab<RA>catabra"
nstr = str.gsub(/.a/) do |matched|
    '<'+matched.upcase+'>'
end
p nstr #=> "ab<RA><CA><TA>b<RA>"

sub 方法与 gsub 方法也有带 ! 的方法。sub! 方法与 gusb! 方法会直接将作为接受者的对象变换为置换后的字符串。

scan示例:

"abracatabra".scan(/.a/) do |matched|
    p matched
end
#执行结果
"ra"
"ca"
"ta"
"ra"
"abracatabra".scan(/(.)(a)/) do |matched|
    p matched
end
#执行结果
["r", "a"]
["c", "a"]
["t", "a"]
["r", "a"]
"abracatabra".scan(/(.)(a)/) do |a, b|
    p a+"-"+b
end
#执行结果
"r-a"
"c-a"
"t-a"
"r-a"
百分购

发表评论

您必须才能发表评论!