《Ruby 基础教程》之正则表达式类

236 阅读4分钟

正则表达式对象的创建方法

在程序中,通过用 // 将表示正则表达式模式的字符串括起来,就可以非常简单地创建出正则表达式。

另外,我们也可以使用类方法 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"]