热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ruby程序中正则表达式的基本使用教程

和Python与Perl一样,Ruby对正则表达式的支持也是相当好的,这里送出整理的Ruby程序中正则表达式的基本使用教程,需要的朋友可以参考下

Ruby大部分的内置类型都和其它的编程语言很相似。主要有strings,integers,floats,arrays等等。然而,只有脚本语言,如Ruby,Perl,和awk等提供了内置表达式类型的支持。正则表达式尽管比较隐蔽,但却是一个很强大的文本处理工具。

正则表达式是使用指定的模式匹配字符串的一种简单的方法。在Ruby中,创建正则表达式的典型方式是把模式写在两个斜线之间/pattern/。

毕竟,Ruby就是Ruby,正则表达式也是对象,也能像对象般操作。

例如,你可以使用下面的正则表达式写一个模式,它匹配一个字符串中包含有Perl或Python。



/Perl|Python/

在正斜线体内,是两个我们要匹配的字符串,它们使用"|"分隔。这个管道符的意思是"左边的或者右边的",在这个模式中是Perl或者Python。

你还可以在模式中使用括号,就像是在算术表达式中使用的那样,因此这个模式还可以写成

/P(erl|ython)/

你还可以在模式中指定重复。例如加号,/ab+c/匹配字符串中一个a后面有一个或多个b然后跟着是一个c。把加号换成星号,/ab*c/创建的正则表达式是匹配一个a后面跟着0个或多个b然后跟着是一个c。

你还可以在模式中匹配一组字符。常用的字符类型例子有\s,它匹配一个空白字符(space,tab,换行符,等等);\d匹配任意数字;\w匹配任意的典型单词字符。句号(.)匹配(基本上)任意字符。

我们把所有这些组合起来,做成实用的正则表达式。

/\d\d:\d\d:\d\d/ # a time such as 12:34:56
/Perl.*Python/  # Perl, zero or more other chars, then Python
/Perl Python/  # Perl, a space, and Python
/Perl *Python/  # Perl, zero or more spaces, and Python
/Perl +Python/  # Perl, one or more spaces, and Python
/Perl\s+Python/ # Perl, whitespace characters, then Python
/Ruby (Perl|Python)/ # Ruby, a space, and either Perl or Python

一但创建了一个模式,不能使用它是件很郁闷的事情。匹配操作符=~用来对一个字符串进行正则表达式匹配。如果匹配成功,=~返回第一次匹配成功的位置,否则它返回nil。也就是说,你可以在if和while的条件声明中使用正则表达式。例如下面的代码片段,

如果字符串中包含有文本Perl或Python时,输出一条信息。

puts "Scripting language mentioned: #{line}" if line =~ /Perl|Python/

你能使用Ruby替换所有出现有Perl和Python的地方。

line.gsub(/Perl|Python/, 'Ruby')

从iHower的Ruby on Rails实战圣经中摘一个示例,用正则表达式抓取手机号码:

phOne= "139-1234-5678"
if phOne=~ /(\d{3})-(\d{4})-(\d{4})/
 start_with = $1
 mid_num = $2
 end_as = $3
end

一般规则(为正常显示,都放在代码块内)

  • /a/匹配字符a。   
  • /\?/匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.   
  • .匹配任意字符,例如/a./匹配ab和ac。   
  • /[ab]c/匹配ac和bc,[]之间代表范围。例如:/[a-z]/ , /[a-zA-Z0-9]/。   
  • /[^a-zA-Z0-9]/匹配不在该范围内的字符串。   
  • /[\d]/代表任意数字
  • /[\w]/代表任意字母,数字或者_
  • /[\s]/代表空白字符,包括空格,TAB和换行。   
  • /[\D]/,/[\W]/,/[\S]/均为上述的否定情况。

高级规则

  • ?代表0或1个字符。/Mrs?\.?/匹配"Mr","Mrs","Mr.","Mrs."。
  • *代表0或多个字符。/Hello*/匹配"Hello","HelloJack"。
  • +代表1或多个字符。/a+c/匹配:"abc","abbdrec"等等。
  • /d{3}/匹配3个数字。
  • /d{1,10}/匹配1-10个数字。
  • /d{3,}/匹配3个数字以上。
  • /([A-Z]\d){5}/匹配首位是大写字母,后面4个是数字的字符串。

正则表达式操作

String和RegExp均支持=~和match两个查询匹配方法:

puts "I can say my name" =~ /name/ #-> 13

a = /name/.match("I can say my name, my name I can say") #-> a is MatchData
puts a[0] #-> name

可以看出,如果能够匹配,=~返回匹配的字符串位置,而match返回一个MatchData对象。如果不匹配,则返回nil。MatchData可以取出其中符合各个子匹配(或子模式)的内容,看下面的例子:

b1=/[A-Za-z]+,[A-Za-z]+,Mrs?\./.match("Jack,Wang,Mrs., nice person")
puts b1[0] #-> Jack,Wang,Mrs

b2=/(([A-Za-z]+),([A-Za-z]+)),Mrs?\./.match("Jack,Wang,Mrs., nice person:)
puts b2[0] #-> Jack,Wang,Mrs
puts b2[1] #-> Jack,Wang
puts b2[2] #-> Jack
puts b2[3] #-> Wang

m[0]返回匹配匹配主表达式的字符串,下面的方法是等同的:m[n]==m.captures[n]

Ruby也自动的为我们填写一些全局变量,它们以数字做名,$1, $2, 等等,$1包含的是正则表达式中从左侧开始的第一对小括号内的子模式所匹配的字符串,以此类推。我们看出匹配时,是从外到内,从左到右的顺序。

贪婪量词和不贪婪量词

量词*(表示零个或多个)和+(表示一个或多个)是贪婪的,它们会匹配尽可能多的字符,我们可以在*和+后面加一个?,使它成为非贪婪量词:

下面代码是: 1个或多个字符后接一个感叹号。

teststr="abcd!efg!"
match=/.+!/.match(teststr)
puts match[0] #-> abcd!efg!

limitmatch=/.+?!/.match(teststr)
puts limitmatch[0] #-> abcd!

锚是指必须满座一定的条件,才能继续匹配:

  • ^     行首
  • $     行尾
  • \A    字符串的开始
  • \z    字符串的结尾
  • \Z    字符串的结尾(不包括最后的换行符)
  • \b    单词边界
c=/\b\w+\b/.match("!!Stephen**")

puts c[0] #-> Stephen

前视断言

前视断言表示想要知道下一个指定的是什么,但并不匹配

肯定的前视断言 (?=)
假设我们想要匹配一个数的序列,该序列以一个圆点结束,但并不想把圆点作为模式匹配的一部分

teststr="123 456 789. 012"
m=/\d+(?=\.)/.match(teststr)
puts m[0] #-> 789

否定的前视断言 (?!)
上例,如果/\d+(?=\.)/改为/\d+(?!\.)/,则puts m[0]输出显示为 123 。

修饰语

修饰语位于正则表达式最结束正则表达式的正斜杠的后面

1.i使正则表达式对大小写不敏感
例如,/abc/i可以匹配Abc,abc,ABC等。

2.m使得正则表达式可以和任何字符匹配,包括换行符,通常情况下圆点通配符不匹配换行符。
字符串与正则表达式的相互转换

字符串内插进正则表达式

teststr="a.c"
re=/#{Regexp.escape(teststr)}/
puts re.match("a.c")[0] #-> a.c
test=re.match("abc")
puts test[0] #-> Nil

正则表达式转换成字符串

puts /abc/.inspect #-> /abc/

使用正则表达式的常见方法:

  • 用于if和while等
  • 用于gsub、grep等
  • 用于find_all、scan等

例如,puts "test 1 2 and test 3 4".scan(/\d/)会输出["1","2","3","4"]。


推荐阅读
  • 导读:在编程的世界里,语言纷繁多样,而大部分真正广泛流行的语言并不是那些学术界的产物,而是在通过自由发挥设计出来的。和那些 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • php课程Json格式规范需要注意的小细节
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgramming ... [详细]
  • Rubyonrails开发人员在这里。此问题曾被问过。 ... [详细]
  • 与.Net大师Jeffrey Richter面对面交流——TUP对话大师系列活动回顾(多图配详细文字)...
    与.Net大师JeffreyRichter面对面交流——TUP对话大师系列活动回顾(多图配文字)上周末很有幸参加了CSDN举行的TUP活动, ... [详细]
  • PHP编程能开发哪些应用?
    导读:很多朋友问到关于PHP编程能开发哪些应用的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • 有没有类似于ruby那样的方式number=5“Thisnumberis#{number}.“#=“Thisnumberis5.“ ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
author-avatar
hupi12丨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有