Ruby - 正则表达式

创建于 2024-12-03 / 25
字体: [默认] [大] [更大]

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

正则表达式文字是斜线之间或任意分隔符之间的模式,后跟 %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

正则表达式修饰符

正则表达式文字可能包含一个可选的修饰符来控制匹配的各个方面。 修饰符在第二个斜杠字符之后指定,如前所示,并且可以由这些字符之一表示 −

序号 修饰符 & 描述
1

i

匹配文本时忽略大小写。

2

o

仅执行一次 #{} 插值,这是第一次评估正则表达式文字。

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

正则表达式模式

除了控制字符 (+ ? . * ^ $ ( ) [ ] { } | ),所有字符都匹配自己。 您可以通过在控制字符前面加上反斜杠来转义它。

序号 模式 & 描述
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

匹配空格。 等价于 [\t\n\rff]。

26

S

匹配非空白。

27

d

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

28

D

匹配非数字。

29

A

匹配字符串的开头。

30



匹配字符串的结尾。 如果存在换行符,它将在换行符之前匹配。

31

z

匹配字符串的结尾。

32

G

Matches point where last match finished.

33

\b

在括号外匹配单词边界。 在括号内时匹配退格 (0x08)。

34

B

M达到非单词边界。

35

\n, \t, etc.

匹配换行符、回车符、制表符等。

36

1...9

匹配第 n 个分组的子表达式。

37

10

如果已经匹配,则匹配第 n 个分组子表达式。 否则指字符代码的八进制表示。


正则表达式示例

序号 示例 & 描述
1

/ruby/

匹配 "ruby"

2

¥

匹配日元标志。 Ruby 1.9 和 Ruby 1.8 支持多字节字符。

序号 示例 & 描述
1

/[Rr]uby/

匹配"Ruby"或"ruby"。

2

/rub[ye]/

匹配"ruby"或"rube"。

3

/[aeiou]/

匹配任何一个小写元音。

4

/[0-9]/

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

5

/[a-z]/

匹配任何小写 ASCII 字母。

6

/[A-Z]/

匹配任何大写的 ASCII 字母。

7

/[a-zA-Z0-9]/

匹配以上任何一项。

8

/[^aeiou]/

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

9

/[^0-9]/

匹配除数字以外的任何内容。

序号 示例 & 描述
1

/./

匹配除换行符以外的任何字符。

2

/./m

在多行模式下,也匹配换行符。

3

/d/

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

4

/D/

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

5

/s/

匹配空格字符:/[ \t\r\nff]/。

6

/S/

匹配非空格:/[^ \t\r\nff]/。

7

/w/

匹配单个单词字符:/[A-Za-z0-9_]/。

8

/W/

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

序号 示例 & 描述
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 位数字。

This matches the smallest number of repetitions −

序号 示例 & 描述
1

/<.*>/

Greedy repetition: matches "<ruby>perl>".

2

/<.*?>/

Non-greedy: matches "<ruby>" in "<ruby>perl>".

序号 示例 & 描述
1

/Dd+/

无组:+ 重复 d

2

/(Dd)+/

分组:+ 重复 Dd 对

3

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

匹配"Ruby"、"Ruby, ruby, ruby"等。

这再次匹配先前匹配的组 −

序号 示例 & 描述
1

/([Rr])uby&1ails/

匹配 ruby&rails 或 Ruby&Rails。

2

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

单引号或双引号字符串。 1 匹配第一组匹配的任何内容。 2 匹配第二组匹配的任何内容,等等。

序号 示例 & 描述
1

/ruby|rube/

匹配"ruby"或"rube"。

2

/rub(y|le))/

匹配 "ruby" 或 "ruble"。

3

/ruby(!+|?)/

"ruby" 后跟一个或多个! 还是一个?

It needs to specify match position.

序号 示例 & 描述
1

/^Ruby/

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

2

/Ruby$/

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

3

/ARuby/

匹配字符串开头的"Ruby"。

4

/Ruby/

匹配字符串末尾的"Ruby"。

5

/\bRuby\b/

在单词边界匹配"Ruby"。

6

/\brubB/

B 是非单词边界:匹配"rube"和"ruby"中的"rub",但不单独匹配。

7

/Ruby(?=!)/

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

8

/Ruby(?!!)/

如果后面没有感叹号,则匹配"Ruby"。

序号 示例 & 描述
1

/R(?#comment)/

匹配"R"。 其余的都是注释。

2

/R(?i)uby/

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

3

/R(?i:uby)/

和上面一样。

4

/rub(?:y|le))/

仅分组而不创建 1 反向引用。


搜索和替换

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

所有这些方法都使用正则表达式模式执行搜索和替换操作。 sub & sub! 替换模式的第一次出现,gsub & gsub! 替换所有出现。

subgsub 返回一个新字符串,保留原始字符串,而 sub!gsub! 修改 调用它们的字符串。

Following is the example −

#!/usr/bin/ruby

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

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
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


0 人点赞过