- A+
所属分类:ruby
Ruby正则表达式
Contents
正则表达式的写法
一般的创建正则表达式方式:
/模式/
如果正则模式中含有/时,也可以采用下面的方式创建正则表达式:
- %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"