详情

首页手游攻略 Ruby正则表达式完整指南

Ruby正则表达式完整指南

佚名 2026-09-16 13:10:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Ruby正则表达式”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • Ruby 正则表达式
    • 语法
    • 实例
  • 正则表达式修饰符
    • 正则表达式模式
      • 正则表达式实例
        • 字符
        • 字符类
        • 特殊字符类
        • 重复
        • 非贪婪重复
        • 借助圆括号进行分组
        • 反向引用
        • 替换
        • 圆括号的特殊语法
      • 搜索和替换
        • 实例

      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匹配空白字符。等价于 [tnrf]。
      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/匹配一个空白字符,等同于 /[ trnf]/
      /S/匹配一个非空白字符,等同于 /[^ trnf]/
      /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>” 中的 “”

      借助圆括号进行分组

      实例描述
      /Dd+/无分组: + 重复 d
      /(Dd)+/分组: + 重复 Dd 对
      /([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” 开头的字符串
      /RubyZ/匹配以 “Ruby” 结尾的字符串
      /bRubyb/匹配单词边界的 “Ruby”
      /brubB/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!(/brailsb/, "Rails")
       
      puts "#{text}"

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

      Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架

      在这个场景下,以上就是Ruby正则表达式详解的详细内容,更多关于Ruby正则表达式的资料请关注脚本之家其它相关文章!

      您可能感兴趣的文章:

      • ruby 正则表达式详解及示例
      • Ruby程序中正则表达式的基本采用教程
      • 详解Ruby中正则表达式对字符串的匹配和替换操作
      • 浅析Ruby中的正则表达式的采用
      • Ruby中采用正则表达式的基础指引
      • 举例初步讲解Ruby中的正则表达式
      • 详细说明Ruby中的正则表达式
      • 采用Ruby re模块新建复杂的正则表达式
      • ruby 正则表达式 教程

      相关资讯
      点击查看更多
      游戏推荐
      推荐专题
      热门阅读
      推荐下载