雷林鹏分享: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匹配空白字符。等价于 [\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
(编辑:雷林鹏 来源:网络)
转载于:https://www.cnblogs.com/pengpeng1208/p/10154790.html
雷林鹏分享:Ruby 正则表达式相关推荐
- 雷林鹏分享:Ruby 字符串(String)
Ruby 字符串(String) Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符. 最简单的字符串是括在单引号(单引号字符)内.在引号标记内的文本 ...
- 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程
Ruby XML, XSLT 和 XPath 教程 什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种 ...
- 雷林鹏分享:Ruby Web Services 应用 - SOAP4R
Ruby Web Services 应用 - SOAP4R 什么是 SOAP? 简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范. ...
- 雷林鹏分享:MySQL 及 SQL 注入
MySQL 及 SQL 注入 如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入 ...
- 雷林鹏分享:Redis 管道技术
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...
- 雷林鹏分享:Lua 面向对象
面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构. 以下几种编程语言都支持面向对象编程: C++ Java Objective-C Smal ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格
jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮,可以简单地为行分组.您可以简单地创建 ...
- 雷林鹏分享:PHP 简介
PHP 是服务器端脚本语言. 您应当具备的基础知识 在继续学习之前,您需要对以下知识有基本的了解: HTML CSS 如果您希望首先学习这些项目,请在我们的 首页 访问这些教程. PHP 是什么? P ...
- 雷林鹏分享:PHP 魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们 ...
最新文章
- Matlab与线性代数 -- 逆矩阵
- 微软是如何输掉API之战(下)
- Android如何使用NoHttp
- 迭代Iterator的用法
- 分析Android银行木马GM Bot的变异过程
- Nginx+Lua(OpenResty) HelloWorld
- Linux 源码安装 Python3 和 pip3
- daemons java,java.lang.ThreadGroup.isDaemon()方法实例
- dbtool一bug跟踪记
- hzwap u.php_『THINKPHP』U 函数
- 【招聘】阿里2022届春招实习生 - 机器学习/NLP/CV等
- 删除字符串前面的0,00,000。。。
- 控制台或者dll中CreateWindow 出错
- 常用邮箱SMTP服务器地址大全
- python下opencv安装
- 计算机第一启动设置u盘启动,怎么设置usb为第一启动_bios设置u盘启动
- 揭露富爸爸背后真正的秘密
- event是什么?事件对象
- Yardi客户入选全球房地产十强报告
- u盘无法格式化怎么办?数据丢失这样恢复
热门文章
- ethtool 开启网卡_ethtool查看网卡以及修改网卡配置
- 103 保序回归 isotonic regression
- 关于canvas获取toDataUrl()相关函数的同源策略问题
- 短视频剪辑小技巧,少用平剪很重要,教你剪出受人欢迎的短视频
- VUE 动态构建混合数据Treeselect选择树,同时解决巨树问题
- DiffuseVAE:完美结合VAE和Diffusion Models
- echarts 动态更新、图表联动connect、事件、分发事件模拟用户行为dispatchAction、清空图表
- 前后分离 php,php服务器如何做前后端分离?
- 固定资产管理系统(原创)
- 【RtpPacketReceived】RTP/UDP包接收并异步处理的封装类:MediaPacketObserverWrapper