正则表达式对象的创建方法
在程序中,通过用 // 将表示正则表达式模式的字符串括起来,就可以非常简单地创建出正则表达式。
另外,我们也可以使用类方法 Regexp.new(str) 来创建对象。当程序中已经定义了字符串对象str,且希望根据这个字符串来创建正则表达式时,就可以使用这个方法。
re = Regexp.new("Ruby")
除上述两种方法外,与数组、字符串一样,我们也可以通过使用 % 的特殊语法来创建正则表达式。正则表达式的情况下使用的是 %r ,如果正则表达式中包含 / ,用这种方法会比较方便。%r 的语法如下所示:
%r( 模式 )
%r< 模式 >
%r| 模式 |
%r! 模式 !
元字符(meta character)
^ 表示匹配行首,$ 表示匹配行尾。也就是说,模式 /^ABC/ 匹配行首为 ABC 的字符串,模式 /ABC$/ 匹配行尾为 ABC 的字符串。
希望指定多个字符中的 1 个字符时,可以使用 []。
[AB]......A 或 B
[ABC]......A 或 B 或 C
[CBA]......同上(与 [ ] 中的顺序无关)
[012ABC]......0、1、2、A、B、C 中的 1 个字符
可以在 [] 中使用 - ,来表示一定范围内的字符串。
[A-Z]......从 A 到 Z 的全部大写英文字母
[a-z]......从 a 到 z 的全部小写英文字母
[0-9]......从 0 到 9 的全部数字
[A-Za-z]......从 A 到 Z 与从 a 到 z 的全部英文字母
[A-Za-z_]......全部 英文字母与 _
如果 - 表示的不是字符类,而是单纯的字符 - ,那么就必须写在模式的开头或者末尾。
[A-Za-z0-9_-]......全部英文字母、全部数字、_、-
在 [] 的开头使用 ^ 时, ^ 表示指定的字符以外的字符。
[^ABC]......A、B、C 以外的字符
[^a-zA-Z]......a 到 z,A 到 Z(英文字母)以外的字符
. 匹配任意字符
\s 表示空白符,匹配空格( 0x20 )、制表符( Tab)、换行符、换页符
\d 匹配 0 到 9 的数字
\w 匹配英文字母与数字
\A 匹配字符串的开头
\z 匹配字符串的末尾
我们还可以用 \ 对元字符进行转义。在 \ 后添加 ^ 、 $ 、[ 等非字母数字的元字符后,该元字符就不再发挥元字符的功能,而是直接被作为字符本身用于匹配。
* 重复 0 次以上
+ 重复 1 次以上
? 重复 0 次或 1 次
{n} 重复 n 次
{n, m} 重复 n~m 次
在正则表达式中使用 {} 可以更详细地指定重复的次数。{3} 表示刚好重复 3 次,{3,} 表示重复 3 次以上,{,3} 表示重复 3 次以下,{3,5} 则表示重复 3~5 次。
*? 0 次以上的重复中最短的部分
+? 1 次以上的重复中最短的部分
通过使用 (),可以重复多个字符
我们可以用 | 在几个候补中任意匹配一个
正则表达式的选项
i 忽略英文字母大小写的选项。指定这个选项后,无论字符串中的字母是大写还是小写都会被匹配。
x 忽略正则表达式中的空白字符以及 # 后面的字符的选项。指定这个选项后,就可以使用 # 在正则表达式中写注释了。
m 指定这个选项后,就可以使用 . 匹配换行符了。
使用正则表达式的方法
sub 方法与 gsub 方法的作用是用指定的字符串替换字符串中的某部分字符。
sub 方法与 gsub 方法都有两个参数。第 1 个参数用于指定希望匹配的正则表达式的模式,第 2 个参数用于指定与匹配的部分替换的字符串。 sub 方法只替换首次匹配的部分,而 gsub 方法则会替换所有匹配的部分。
str = "abc def g hi"
p str.sub(/\s+/,' ') #=> "abc def g hi"
p str.gsub(/\s+/,' ') #=> "abc def g hi"
sub 方法与 gsub 方法还可以使用块。这时,程序会将字符串中匹配的部分传递给块,并在块中使用该字符串进行处理。这样一来,块中返回的字符串就会替换字符串中匹配的部分。
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 方法能像 gsub 方法那样获取匹配部分的字符,但不能进行替换操作。因此,当需要对匹配部分进行某种处理时,可以使用该方法
"abracatabra".scan(/.a/) do |matched|
p matched
end
"ra"
"ca"
"ta"
"ra"
如果没有指定块,则直接返回匹配的字符串数组。
p "abracatabra".scan(/.a/) #=> ["ra", "ca", "ta", "ra"]