• 迎丰收 晒丰收 庆丰收 2018-10-15
  • “捂脸表情”被注册成商标?申请人不认为商标侵权 2018-10-15
  • 战巡南海、绕岛巡航…空军有“飞出去”的主心骨 2018-10-14
  • 幼儿园要求家长写一万字读后感:不能这样玩家长|幼儿园|家长-教育时讯 2018-10-13
  • 中国故宫文物展在希腊举行 2018-10-13
  • 車·晓 第26期 車企官方降价真相幾何? 2018-10-12
  • 宝沃总裁杨嵩:曾和奔驰宝马同水平 已不能同日而语 2018-10-11
  • 新时代党员干部要有更大的担当和作为 2018-10-10
  • “2018-雷霆”专项行动破获百余起台湾间谍案 2018-10-09
  • 朝韩首脑今起在平壤会晤 “金文会”将聚焦三大议题 2018-10-09
  • 2018顺义啤酒节--北京频道--人民网 2018-10-08
  • 台湾遭遇的“断交潮”有无化解之道? 2018-10-08
  • 习近平会见爱沙尼亚总统卡柳莱德 2018-10-08
  • 中国空间站研制建设正有序开展 坚持和平利用 2018-10-07
  • Idlib to further divide Ankara and Moscow 2018-10-06
  • 【ruby教程】Ruby 正则表达式

    栏目: Ruby 发布于: 2014-11-26 07:36:38

    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 个数字。

    非贪婪重复

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

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

    通过圆括号进行分组

    实例描述
    /\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 反向引用

    搜索和替换

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

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

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

    下面是一个实例:

    #!/usr/bin/ruby
    
    phone = "2004-959-559 #This is Phone Number"
    
    # 删除 Ruby 的注释
    phone = phone.sub!(/#.*$/, "")   
    puts "Phone Num : #{phone}"
    
    # 移除数字以外的其他字符
    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"
    
    # 把所有的 "rails" 改为 "Rails"
    text.gsub!("rails", "Rails")
    
    # 把所有的单词 "Rails" 都改成首字母大写
    text.gsub!(/\brails\b/, "Rails")
    
    puts "#{text}"
    

    这将产生以下结果:

    Rails are Rails, really good Ruby on Rails
    

    本文转载自:w3cschool
    本站文章除注明转载外,均为本站原创或编译?;队魏涡问降淖?,但请务必注明出处。
    转载请注明:文章转载自 七星彩票平台
    本文标题:【ruby教程】Ruby 正则表达式
    IT技术书籍推荐:
    疯狂Java讲义(第3版)
    疯狂Java讲义(第3版)
    李刚 (作者)
    《疯狂Java讲义(第3版)》内容简介:《疯狂Java讲义(第3版)》是《疯狂Java讲义》的第3版,第3版保持了前两版系统、全面、讲解浅显、细致的特性,全面新增介绍了Java 8的新特性,《疯狂Java讲义(第3版)》大部分示例程序都采用Lambda表达式、流式API进行了改写,因此务必使用Java 8的JDK来编译、运行。 《疯狂Java讲义(第3版)》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制。覆盖了java.lang、java.util、java.text、java.io和java.nio、java.sql、java.awt、javax.swing包下绝大部分类和接口?!斗杩馢ava讲义(第3版)》全面介绍了Java 8的新的接口语法、Lambda表达式、方法引用、构造器引用、函数式编程、流式编程、新的日期、时间API、并行支持、改进的类型推断、重复注解、JDBC 4.2新特性等新特性。