当前位置: 代码网 > it编程>前端脚本>Ruby > Ruby正则表达式详解

Ruby正则表达式详解

2024年05月15日 Ruby 我要评论
ruby 正则表达式正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找字符串集合。正则表达式用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串&quo

ruby 正则表达式

正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找字符串集合。

正则表达式用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

语法

正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模式,如下所示:

/pattern/
/pattern/im    # 可以指定选项
%r!/usr/local! # 使用分隔符的正则表达式

实例

#!/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

正则表达式修饰符

正则表达式从字面上看可能包含一个可选的修饰符,用于控制各方面的匹配。修饰符在第二个斜杠字符后指定,如上面实例所示。下标列出了 可能的修饰符:

修饰符描述
i当匹配文本时忽略大小写。
o只执行一次 #{} 插值,正则表达式在第一次时就进行判断。
x忽略空格,允许在整个表达式中放入空白符和注释。
m匹配多行,把换行字符识别为正常字符。
u,e,s,n把正则表达式解释为 unicode(utf-8)、euc、sjis 或 ascii。如果没有指定修饰符,则认为正则表达式使用的是源编码。

 就像字符串通过 %q 进行分隔一样,ruby 允许您以 %r 作为正则表达式的开头,后面跟着任意分隔符。这在描述包含大量您不想转义的斜杠字符时非常有用。

# 下面匹配单个斜杠字符,不转义
%r|/|               
 
# flag 字符可通过下面的语法进行匹配
%r[</(.*)>]i

正则表达式模式

除了控制字符,(+ ? . * ^ $ ( ) [ ] { } | ),其他所有字符都匹配本身。您可以通过在控制字符前放置一个反斜杠来对控制字符进行转义。

下表列出了 ruby 中可用的正则表达式语法。

模式描述
^匹配行的开头。
$匹配行的结尾。
.匹配除了换行符以外的任意单字符。使用 m 选项时,它也可以匹配换行符。
[…]匹配在方括号中的任意单字符。
[^…]匹配不在方括号中的任意单字符。
re*匹配前面的子表达式零次或多次。
re+匹配前面的子表达式一次或多次。
re?匹配前面的子表达式零次或一次。
re{ n}匹配前面的子表达式 n 次。
re{ n,}匹配前面的子表达式 n 次或 n 次以上。
re{ n, m}匹配前面的子表达式至少 n 次至多 m 次。
a| b匹配 a 或 b。
(re)对正则表达式进行分组,并记住匹配文本。
(?imx)暂时打开正则表达式内的 i、 m 或 x 选项。如果在圆括号中,则只影响圆括号内的部分。
(?-imx)暂时关闭正则表达式内的 i、 m 或 x 选项。如果在圆括号中,则只影响圆括号内的部分。
(?: re)对正则表达式进行分组,但不记住匹配文本。
(?imx: re)暂时打开圆括号内的 i、 m 或 x 选项。
(?-imx: re)暂时关闭圆括号内的 i、 m 或 x 选项。
(?#…)注释。
(?= re)使用模式指定位置。没有范围。
(?! re)使用模式的否定指定位置。没有范围。
(?> re)匹配无回溯的独立模式。
\w匹配单词字符。
\w匹配非单词字符。
\s匹配空白字符。等价于 [\t\n\r\f]。
\s匹配非空白字符。
\d匹配数字。等价于 [0-9]。
\d匹配非数字。
\a匹配字符串的开头。
\z匹配字符串的结尾。如果存在换行符,则只匹配到换行符之前。
\z匹配字符串的结尾。
\g匹配最后一个匹配完成的点。
\b当在括号外时匹配单词边界,当在括号内时匹配退格键(0x08)。
\b匹配非单词边界。
\n, \t, etc.匹配换行符、回车符、制表符,等等。
\1…\9匹配第 n 个分组子表达式。
\10如果已匹配过,则匹配第 n 个分组子表达式。否则指向字符编码的八进制表示。

 正则表达式实例

字符

实例描述
/ruby/匹配 “ruby”
¥匹配 yen 符号。ruby 1.9 和 ruby 1.8 支持多个字符。

 字符类

实例描述
/[rr]uby/匹配 “ruby” 或 “ruby”
/rub[ye]/匹配 “ruby” 或 “rube”
/[aeiou]/匹配任何一个小写元音字母
/[0-9]/匹配任何一个数字,与 /[0123456789]/ 相同
/[a-z]/匹配任何一个小写 ascii 字母
/[a-z]/匹配任何一个大写 ascii 字母
/[a-za-z0-9]/匹配任何一个括号内的字符
/[^aeiou]/匹配任何一个非小写元音字母的字符
/[^0-9]/匹配任何一个非数字字符

 特殊字符类

实例描述
/./匹配除了换行符以外的其他任意字符
/./m在多行模式下,也能匹配换行符
/\d/匹配一个数字,等同于 /[0-9]/
/\d/匹配一个非数字,等同于 /[^0-9]/
/\s/匹配一个空白字符,等同于 /[ \t\r\n\f]/
/\s/匹配一个非空白字符,等同于 /[^ \t\r\n\f]/
/\w/匹配一个单词字符,等同于 /[a-za-z0-9_]/
/\w/匹配一个非单词字符,等同于 /[^a-za-z0-9_]/

 重复

实例描述
/ruby?/匹配 “rub” 或 “ruby”。其中,y 是可有可无的。
/ruby*/匹配 “rub” 加上 0 个或多个的 y。
/ruby+/匹配 “rub” 加上 1 个或多个的 y。
/\d{3}/刚好匹配 3 个数字。
/\d{3,}/匹配 3 个或多个数字。
/\d{3,5}/匹配 3 个、4 个或 5 个数字。

 非贪婪重复

这会匹配最小次数的重复。

实例描述
/<.*>/贪婪重复:匹配 “perl>”
/<.*?>/非贪婪重复:匹配 “perl>” 中的 “”

 通过圆括号进行分组

实例描述
/\d\d+/无分组: + 重复 \d
/(\d\d)+/分组: + 重复 \d\d 对
/([rr]uby(, )?)+/匹配 “ruby”、“ruby, ruby, ruby”,等等

 反向引用

这会再次匹配之前匹配过的分组。

实例描述
/([rr])uby&\1ails/匹配 ruby&rails 或 ruby&rails
/(['"])(?😦?!\1).)*\1/单引号或双引号字符串。\1 匹配第一个分组所匹配的字符,\2 匹配第二个分组所匹配的字符,依此类推。

 替换

实例描述
/ruby|rube/匹配 “ruby” 或 “rube”
/rub(y|le)/匹配 “ruby” 或 “ruble”
/ruby(!+|?)/“ruby” 后跟一个或多个 ! 或者跟一个 ?

 

这需要指定匹配位置。

实例描述
/^ruby/匹配以 “ruby” 开头的字符串或行
/ruby$/匹配以 “ruby” 结尾的字符串或行
/\aruby/匹配以 “ruby” 开头的字符串
/ruby\z/匹配以 “ruby” 结尾的字符串
/\bruby\b/匹配单词边界的 “ruby”
/\brub\b/\b 是非单词边界:匹配 “rube” 和 “ruby” 中的 “rub”,但不匹配单独的 “rub”
/ruby(?=!)/如果 “ruby” 后跟着一个感叹号,则匹配 “ruby”
/ruby(?!!)/如果 “ruby” 后没有跟着一个感叹号,则匹配 “ruby”

 圆括号的特殊语法

实例描述
/r(?#comment)/匹配 “r”。所有剩余的字符都是注释。
/r(?i)uby/当匹配 “uby” 时不区分大小写。
/r(?i:uby)/与上面相同。
/rub(?:y|le))/只分组,不进行 \1 反向引用

搜索和替换

sub 和 gsub 及它们的替代变量 sub! 和 gsub! 是使用正则表达式时重要的字符串方法。

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

sub 和 gsub 返回一个新的字符串,保持原始的字符串不被修改,而 sub! 和 gsub! 则会修改它们调用的字符串。

实例

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
 
phone = "138-3453-1111 #这是一个电话号码"
 
# 删除 ruby 的注释
phone = phone.sub!(/#.*$/, "")   
puts "电话号码 : #{phone}"
 
# 移除数字以外的其他字符
phone = phone.gsub!(/\d/, "")    
puts "电话号码 : #{phone}"

以上实例运行输出结果为:

电话号码 : 138-3453-1111 
电话号码 : 13834531111

实例

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
 
text = "rails 是 rails,  ruby on rails 非常好的 ruby 框架"
 
# 把所有的 "rails" 改为 "rails"
text.gsub!("rails", "rails")
 
# 把所有的单词 "rails" 都改成首字母大写
text.gsub!(/\brails\b/, "rails")
 
puts "#{text}"

以上实例运行输出结果为:

rails 是 rails,  ruby on rails 非常好的 ruby 框架

以上就是ruby正则表达式详解的详细内容,更多关于ruby正则表达式的资料请关注代码网其它相关文章!

(0)

相关文章:

  • Ruby信号处理详解

    Ruby信号处理详解

    ruby使用process.kill发送信号process.kill(signal, pid, ...) → integerprocess.kill发送指定的信... [阅读全文]
  • Ruby 面向对象知识总结

    Ruby 面向对象知识总结

    ruby 是纯面向对象的语言,ruby 中的一切都是以对象的形式出现。ruby 中的每个值都是一个对象,即使是最原始的东西:字符串、数字,甚至连 true 和 ... [阅读全文]
  • 深入分析Ruby 变量

    深入分析Ruby 变量

    变量是持有可被任何程序使用的任何数据的存储位置。ruby 支持五种类型的变量。 一般小写字母、下划线开头:变量(variable)。 $开头:全局变量(gl... [阅读全文]
  • Ruby 迭代器知识汇总

    Ruby 迭代器知识汇总

    简单来说:迭代(iterate)指的是重复做相同的事,所以迭代器(iterator)就是用来重复多次相同的事。迭代器是集合支持的方法。存储一组数据成员的对象称为... [阅读全文]
  • Ruby生成随机数的方法总结

    Ruby生成随机数的方法总结

    数字实际上不是随机的没有一台计算机能纯粹通过计算产生真正的随机数。它们能做的最好的事情就是生成伪随机数,伪随机数是一组看起来随机但实际上不是随机的数字。对于人类... [阅读全文]
  • 最新的CocoaPods安装教程

    最新的CocoaPods安装教程

    cocoapods是什么?当你开发ios应用时,会经常使用到很多第三方开源类库,比如jsonkit,afnetworking等等。可能某个类库又用到其他类库,所... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com