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
正则表达式模式
除了控制字符 (+ ? . * ^ $ ( ) [ ] { } | ),所有字符都匹配自己。 您可以通过在控制字符前面加上反斜杠来转义它。
序号 | 模式 & 描述 |
---|---|
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 方法是 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