Ruby - 正则表达式

正则表达式是一个特殊的字符序列,可帮助您使用模式中保存的专用语法匹配或查找其他字符串或字符串集.

正则表达式文字是斜杠之间或任意分隔符之间的模式,后跟%r,如下 :

语法

/pattern/
/pattern/im    # option can be specified
%r!/usr/local! # general delimited regular expression

示例

#!/usr/bin/ruby

line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";

if ( line1 =~ /Cats(.*)/ )
   puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
   puts "Line2 contains  Dogs"
end

这将产生以下结果 :

Line1 contains Cats

正则表达式修饰符

正则表达式文字可能包含一个可选修饰符来控制匹配的各个方面.修饰符在第二个斜杠字符后面指定,如前所示,可以用其中一个字符表示 :

Sr.No.修饰符&说明
1

i

在匹配文字时忽略大小写.

2

o

仅执行一次#{}插值,第一次评估regexp文字.

3

x

忽略空格并允许正则表达式中的注释.

4

m

匹配多行,将换行符识别为普通字符.

5

u,e,s,n

将正则表达式解释为Unicode(UTF-8) ,EUC,SJIS或ASCII.如果未指定这些修饰符,则假定正则表达式使用源编码.

与使用%Q分隔的字符串文字一样,Ruby允许您使用%r开始正则表达式,后跟您选择的分隔符.当您描述的模式包含许多您不想转义的正斜杠字符时,这很有用;

# Following matches a single slash character, no escape required
%r|/|

# Flag characters are allowed with this syntax, too
%r[</(.*)>]i

正则表达式模式

除控制字符外,(&plus;?.* ^&dollar;()[] {} | \) ,所有人物都匹配自己.您可以通过在反斜杠前加上控制字符来转义它.

Sr.No.Pattern &安培;说明
1

^

匹配行首.

2

$

匹配行尾.

3

.

匹配除换行符之外的任何单个字符.使用m选项也可以匹配换行符.

4

[...]

匹配括号中的任何单个字符.

5

[^ ...]

匹配括号内的任何单个字符

6

re *

匹配0个或多个前面的表达式.

7

re +

匹配1个或多个前面的表达式.

8

re?

匹配0或1出现在前表达式.

9

re {n}

完全匹配前面表达式的n次出现次数.

10

re { n,}

匹配前面表达式的n个或多个匹配项.

11

re {n,m}

匹配前面表达式中至少n次和最多m次出现.

12

a | b

匹配a或b.

13

(re)

分组正则表达式并记住匹配的文本.

14

(?imx)

暂时切换正则表达式中的i,m或x选项.如果在括号中,只有该区域受到影响.

15

(? -  imx)

暂时切换正则表达式中的i,m或x选项.如果在括号中,只有该区域受到影响.

16

(?:re)

将正则表达式分组而不记住匹配的文本.

17

(?imx:re)

临时切换括号内的i,m或x选项.

18

(? -  imx:re)

临时切换括号内的i,m或x选项.

19

(?#...)

评论.

20

(?= re )

使用模式指定位置.没有范围.

21

(?!re)

使用模式否定指定位置.没有范围.

22

(?> re)

匹配独立模式而不回溯.

23

\w

匹配单词字符.

24

\ W

匹配非单词字符.

25

\s

匹配空格.相当于[\\\\\\\\].

26

\S

匹配非空白.

27

\d

匹配数字.相当于[0-9].

28

\ D

匹配非数字.

29

\A

匹配字符串的开头.

30

\ Z

匹配字符串结尾.如果存在换行符,则它在换行符之前匹配.

31

\ z

匹配字符串结尾.

32

\ G

匹配最后一场比赛结束的点.

33

\ b

在括号外匹配字边界.在括号内匹配退格(0x08).

34

\B

匹配非字边界.

35

\ n,\t等

匹配换行符,回车符,制表符等.

36

\ 1 ... \ 9

匹配第n个分组子表达式.

37

\10

匹配已匹配的第n个分组子表达式.否则引用字符代码的八进制表示.

正则表达式示例

Sr.No.示例&说明
1

/ruby/

匹配"ruby".

2

¥

匹配日元符号. Ruby 1.9和Ruby 1.8支持多字节字符.

Sr.No.示例&说明
1

/[Rr] uby/

匹配"Ruby"或"ruby".

2

/rub [ye]/

匹配"ruby"或"rube".

3

/[aeiou]/

匹配任何一个小写元音.

4

/[0-9 ]/

匹配任何数字;与/[0123456789]相同/.

5

/[az]/

匹配任何小写的ASCII字母.

6

/[AZ]/

匹配任何大写的ASCII字母.

7

/[a-zA-Z0-9]/

匹配上述任何一项.

8

/[^ aeiou]/

匹配小写元音以外的任何内容.

9

/[^ 0-9]/

匹配数字以外的任何内容.

Sr.No.示例&说明
1

/./

匹配除换行之外的任何字符.

2

/./m

多线模式,也匹配换行.

3

/\d/

匹配一个数字:/[0-9]/.

4

/\D/

匹配非数字:/[^ 0-9]/.

5

/\s/

匹配一个空格字符:/[ \t\r\n\f]/.

6

/\S/

匹配非-whitespace:/[^ \t\r\n\f]/.

7

/\w/

匹配单个字符:/[A-ZA-Z0-9 _]/

8

/\ W/

匹配非单词字符:/[^ A-Za-z0-9 _]/.

Sr.No.示例&说明
1

/ruby?/

匹配"rub"或"ruby":y是可选的.

2

/ruby */

匹配"rub"加0或更多ys.

3

/ruby +/

匹配"rub"加1或更多ys.

4

/\d{3}/

正好匹配3位数.

5

/\ d {3,}/

匹配3位或更多位数.

6

/\d {3,5}/

匹配3,4或5位数.

这匹配最小重复次数减去;

Sr.No.示例&说明
1

/<. *>/

贪婪重复:匹配"< ruby> perl>".

2

/<.*?>/

非贪婪:匹配"< ruby>"在"< ruby> perl>".

Sr.No.示例&说明
1

/\D\d +/

没有组:+重复\d

2

/(\D\d)+/

分组:+重复\ D \ d对

3

/([Rr] uby(,)?)+/

匹配"Ruby","Ruby,ruby,ruby"等.

这匹配先前匹配的组 :

Sr.No.示例&说明
1

/([Rr])uby& \1ails/

匹配ruby& rails或Ruby& Rails.

2

/(['"]) (?:(?!\ 1).)* \1/

单引号或双引号字符串.\ n匹配第一组匹配的任何内容. \\ 2匹配匹配的第二组等等.

Sr .No.示例&描述
1

/ruby | rube/

匹配"ruby"或"rube" ".

2

/rub(y | le))/

Ma tches"ruby"或"ruble".

3

/ruby(!+ | \?)/

"ruby"后跟一个或多个!或者一个?

需要指定匹配位置.

Sr.No.示例&说明
1

/^ Ruby/

在字符串或内部行的开头匹配"Ruby".

2

/Ruby&dollar;/

在字符串或行的末尾匹配"Ruby".

3

/\ARuby/

匹配"Ruby"at字符串的开头.

4

/Ruby \Z/

在字符串末尾匹配"Ruby".

5

/\bRuby \b/

在单词边界匹配"Ruby".

6

/\ brub\B/

\B是非字边界:匹配"rube"和"ruby"中的"rub"但不单独.

7

/Ruby(?=!)/

匹配"Ruby ",如果后跟感叹号.

8

/Ruby(?!!)/

匹配"Ruby",如果没有后跟感叹号点.

Sr.No.示例&描述
1

/R(? #comment)/

匹配"R".剩下的就是评论.

2

/R(?i)uby/

匹配"uby"时不区分大小写.

3

/R(?i :uby)/

与上述相同.

4

/rub(?:y | le))/

仅限组而不创建\1反向引用.

搜索和替换

使用正则表达式的一些最重要的String方法是 sub gsub ,以及它们的就地变体 sub! gsub!.

所有这些方法都使用Regexp执行搜索和替换操作图案. sub & sub!取代第一次出现的模式, gsub & gsub!替换所有出现次数.

sub gsub 返回一个新字符串,保留原始字符串未经修改的地方 sub! gsub!修改调用它们的字符串.

以下是示例 :

#!/usr/bin/ruby

phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*&dollar;/, "")   
puts "Phone Num : #{phone}"

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"

这将产生以下结果 :

Phone Num : 2004-959-559
Phone Num : 2004959559

以下是另一个例子 :

#!/usr/bin/ruby

text = "rails are rails, really good Ruby on Rails"

# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")

# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"

这将产生以下结果 :

Rails are Rails, really good Ruby on Rails