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
正则表达式修饰符
正则表达式文字可能包含一个可选的修饰符来控制匹配的各个方面。 修饰符在第二个斜杠字符之后指定,如前所示,并且可以由这些字符之一表示 −
序号
修饰符 & 描述
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
正则表达式模式
除了控制字符 (+ ? . * ^ $ ( ) [ ] { } | \) ,所有字符都匹配自己。 您可以通过在控制字符前面加上反斜杠来转义它。
下表列出了 Ruby 中可用的正则表达式语法。
序号
模式 & 描述
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\r\f]。
26
\S
匹配非空白。
27
\d
匹配数字。 相当于 [0-9]。
28
\D
匹配非数字。
29
\A
匹配字符串的开头。
30
\Z
匹配字符串的结尾。 如果存在换行符,它将在换行符之前匹配。
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 个分组子表达式。 否则指字符代码的八进制表示。
正则表达式示例
Literal Characters
序号
示例 & 描述
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\n\f]/。
6
/\S/
匹配非空格:/[^ \t\r\n\f]/。
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 位数字。
Non-greedy Repetition
This matches the smallest number of repetitions −
序号
示例 & 描述
1
/<.*>/
Greedy repetition: matches "<ruby>perl>".
2
/<.*?>/
Non-greedy: matches "<ruby>" in "<ruby>perl>".
用括号分组
序号
示例 & 描述
1
/\D\d+/
无组:+ 重复 \d
2
/(\D\d)+/
分组:+ 重复 \D\d 对
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\Z/
匹配字符串末尾的"Ruby"。
5
/\bRuby\b/
在单词边界匹配"Ruby"。
6
/\brub\B/
\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 方法是 sub 和 gsub ,以及它们的就地变体 sub! 和 gsub ! 。
所有这些方法都使用正则表达式模式执行搜索和替换操作。 sub & sub! 替换模式的第一次出现,gsub & gsub! 替换所有出现。
sub 和 gsub 返回一个新字符串,保留原始字符串,而 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