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

  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

  (编辑:雷林鹏 来源:网络)

雷林鹏分享:Ruby 正则表达式的更多相关文章

  1. 雷林鹏分享:Ruby 循环

    Ruby 循环 Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code ...

  2. 雷林鹏分享:Ruby 字符串(String)

    Ruby 字符串(String) Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符. 最简单的字符串是括在单引号(单引号字符)内.在引号标记内的文本 ...

  3. 雷林鹏分享:C# 正则表达式

    C# 正则表达式 正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类 ...

  4. 雷林鹏分享:Ruby 安装 - Windows

    Ruby 安装 - Windows 下面列出了在 Windows 机器上安装 Ruby 的步骤. 注意:在安装时,您可能有不同的可用版本. 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 R ...

  5. 雷林鹏分享:Ruby 安装 - Unix

    Ruby 安装 - Unix 下面列出了在 Unix 机器上安装 Ruby 的步骤. 注意:在安装之前,请确保您有 root 权限. 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 Ruby ...

  6. 雷林鹏分享:Ruby 命令行选项

    Ruby 命令行选项 Ruby 一般是从命令行运行,方式如下: $ ruby [ options ] [.] [ programfile ] [ arguments ... ] 解释器可以通过下列选项 ...

  7. 雷林鹏分享:Ruby 语法

    Ruby 语法 让我们编写一个简单的 Ruby 程序.所有的 Ruby 文件扩展名都是 .rb.所以,把下面的源代码放在 test.rb 文件中. #!/usr/bin/ruby -w puts &q ...

  8. 雷林鹏分享:Ruby 环境变量

    Ruby 环境变量 Ruby 解释器使用下列环境变量来控制它的行为.ENV 对象包含了所有当前设置的环境变量列表. 变量描述 DLN_LIBRARY_PATH动态加载模块搜索的路径. HOME当没有参 ...

  9. 雷林鹏分享:Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

随机推荐

  1. centos7.4yum错误

    1. 首先删除redhat原有的yum   rpm -aq | grep yum | xargs rpm -e --nodeps   rpm -aq | grep python-iniparse | ...

  2. ZOJ 3203 Light Bulb

    Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow a ...

  3. IoC COntainer Create Javabeans 可以通过读取beans.xml 文件来创建一个应用程序上下文对象 依赖反转

    Spring初学快速入门 - Spring教程™ https://www.yiibai.com/spring/spring-tutorial-for-beginners.html# pom <? ...

  4. Qt::浅谈信号槽连接,参数在多线程中的使用

    Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Q ...

  5. 大话存储1——存储系统的发展,计算机I/O

    1 存储发展 存储在这里的含义为信息记录,是伴随人类活动出现的技术. 1. 竹简和纸张 竹简是中国古代使用的记录文字的工具,后来被纸张所取代,如图1.1所示. 2. 选数管 选数管是20世纪中期出现的 ...

  6. mysql 数据操作 多表查询 多表连接查询 笛卡尔积

    1 交叉连接:不适用任何匹配条件.生成笛卡尔积 所有员工都和四个部门 做了对应关系 mysql> select * from employee,department; +----+------- ...

  7. centos LAMP第三部分php,mysql配置 php配置文件 配置php的error_log 配置php的open_basedir 安装php的扩展模块 phpize mysql配置第二十一节课

    centos   LAMP第三部分php,mysql配置 php配置文件   配置php的error_log  配置php的open_basedir 安装php的扩展模块 phpize  mysql配 ...

  8. Windows mysql默认字符集修改

    一.通过MySQL命令行修改: set character_set_client=utf8; set character_set_connection=utf8; set character_set_ ...

  9. python 操作 mysql 数据库 datetime 属性字段为 0000-00-00 00:00:00 的问题

    撇开 sqlalchemy, 先讲 MySQLdb 和 pymysql mysql 版本 mysql  Ver 14.14 Distrib 5.1.73 新建一个测试表 test, 结构如下: mys ...

  10. Linux系统——公网定制化yum仓库部署

    1)搭建公网源yum仓库 安装wget aliyun源 # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel ...