详解Ruby中正则表达式对字符串的匹配和替换操作

正则匹配

说起Ruby当然要提起它的正则表达式机制,正则表达式作为一个强大的匹配语言已经越来越多的使用到不同的领域当中,从字符串验证,匹配,到网页抽取等。虽然有些人诟病与正则表达式的匹配效率,但是考虑到正则的强大匹配能力也就无所谓了。

说起Ruby正则表达式不就不能不说起Ruby的=~和match两种匹配方式,我们还是用实例来说明一下这两种匹配方式的区别吧。先来说一说=~的用法吧:

message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex=~message
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex=~message

在Ruby当中是用//来表示正则表达式匹配语句的。大家可以运行一下,上面的语句是匹配三个数字两边都是小写字母的一个字符串。我们运行上面代码,将会出现结果10.你一定很奇怪,为什么会出现10这个结果,这就是=~的魅力,他是将匹配结果的首次出现位置打印出来。

那下面我们来看看match吧:

message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex.match(message) 

message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/ 

puts regex.match(message)

我们来看看输出结果吧:f414j。该字符串表示的正则语句匹配的所有符合规则的结果集。不知道大家注意到没,我们在正则表达式里面用到了括号,我们希望抽取出三个数字就可以了。当然这也很简单,我们只需要在上面的代码当中稍作修改即可:

message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
regex.match(message)
puts $1 

message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
regex.match(message)
puts $1

结果自然是414.为什么要使用$1而不是$0呢,我们看看$0的结果吧。

C:/Users/Administrator/Documents/NetBeansProjects/RubyApplication1/lib/regex.rb

它是输出的该对象信息。

下面又出现了一个新的情况,假设一个字符串当中有很多符合规则的信息怎么办呢。上面的语句只能匹配出最先找到的结果,而我们需要把所有的结果都打印出来怎么办呢?刚开始我受java的影响,认为match的结果会是一个集合,所以怎么考虑也没有整出来。后来发现有一个scan方法。代码如下所示:

message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf"
regex=/[a-z](\d{3})[a-z]/
message.scan(regex).each{|m|puts"Theresultis#{m[0]}"} 

message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf"
regex=/[a-z](\d{3})[a-z]/
message.scan(regex).each{|m|puts"Theresultis#{m[0]}"}

很简单,结果就是:

Theresultis414
Theresultis223
Theresultis123 

Theresultis414
Theresultis223
Theresultis123

怎么样,很方便吧。很简单的就把所有的匹配结果都抽取出来了。

正则表达式的分组

可以对正则表达式进行分组,并在匹配成功后把分组的值存储到$1,$2,$3,$4.......

print $1,"\n",$2 if "a1b2c3d4e5" =~ /(\w{2})(\w*)/

字符串的正则替换:

print "abcd".sub(/\w/,"9")
print "\n"
print "abcd".gsub(/\w/,"9")

正则中的特殊全局变量:

  • $1,$2,$3....分组匹配文本
  • $`   匹配文本之前的文本
  • $'    匹配文本之后的文本
print <pre name="code" class="ruby">,"\n",{1},"\n", 

if "ab9cd" =~ /\d/
(0)

相关推荐

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

    Ruby大部分的内置类型都和其它的编程语言很相似.主要有strings,integers,floats,arrays等等.然而,只有脚本语言,如Ruby,Perl,和awk等提供了内置表达式类型的支持.正则表达式尽管比较隐蔽,但却是一个很强大的文本处理工具. 正则表达式是使用指定的模式匹配字符串的一种简单的方法.在Ruby中,创建正则表达式的典型方式是把模式写在两个斜线之间/pattern/. 毕竟,Ruby就是Ruby,正则表达式也是对象,也能像对象般操作. 例如,你可以使用下面的正则表达式写

  • 举例初步讲解Ruby中的正则表达式

    正则表达式是一个特殊的字符序列可以帮助匹配或者找到其他字符串或串套,使用的模式保持一个专门的语法. 正则表达式文本是一个模式之间的斜线之间或任意分隔符 %r 如下: 语法: 复制代码 代码如下: /pattern/ /pattern/im    # option can be specified %r!/usr/local! # general delimited regular expression 例如: #!/usr/bin/ruby line1 = "Cats are smarter t

  • ruby 正则表达式详解及示例代码

    在编写puppet的pp文件中,会用到很多ruby的正则表达式,常用的正则如下: 正则表达式: [codesyntax lang="ruby"] {}: 重复次数(如 {4}表示前面的会重复出现恰好4次) {m,n}: 前面元素最少出现m次,最多出现n次 []: 范围描述符(如 [a-z]表示在a-z范围内的一个字母) \w: 字符或数字,相当于[0-9A-Za-z] \W: 非字母或数字 \s: [\t\n\r\f]空字符,相当于[\t\n\r\f] \S: 非空字符 \d: [0-

  • 使用Ruby re模块创建复杂的正则表达式

    例如,考虑下面的匹配日期的正则表达式: 复制代码 代码如下: /\A((?:19|20)[0-9]{2})[\- \/.](0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])\z/ 使用Re之后,正则表达式可以短小易读的表达式为基础,一步一步地构建出来,例如: 复制代码 代码如下: require 're' include Re delim                = re.any("- /.")century_prefix      

  • 浅析Ruby中的正则表达式的使用

    如果只是需要中查找字符串的 text, 不要使用正则表达式:string['text'] 针对简单的结构, 你可以直接使用string[/RE/]的方式来查询. match = string[/regexp/] # get content of matched regexp first_group = string[/text(grp)/, 1] # get content of captured group string[/text (grp)/, 1] = 'replace' # strin

  • 详细介绍Ruby中的正则表达式

    正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找其他字符串或字符串集合. 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模式,如下所示: /pattern/ /pattern/im # 可以指定选项 %r!/usr/local! # 一般的分隔的正则表达式 实例 #!/usr/bin/ruby line1 = "Cats are smarter than dogs"; line2 = "Dogs also like m

  • ruby 正则表达式 教程

    我们再看一个更有趣的程序.这次我们来测试一个字符串是否和一个由简明模式(concise pattern)编码产生的描述相匹配. 在这些模式(pattern)里,一些字符或字符组合都有独特的意义,包括: 复制代码 代码如下: []  范围描述符 (比如,[a - z] 表示在a 到 z 范围内的一个字母) \w  字母或数字;相当于 [0-9A-Za-z] \W  非字母,数字 \s  [ \t\n\r\f]空字符;相当于 [ \t\n\r\f] \S  非空字符 \d  [0-9]数字;相当于 

  • Ruby中使用正则表达式的基础指引

    正则表达式的内建支持通常只限于脚本语言如Ruby,Perl和awk等,这是一个耻辱:尽管正则表达式很神秘,但它是一个强大的文本处理工具.通过内建而不是通过程序库接口来支持它,有很大的不同. 正则表达式只是一种指定字符模式的方法,这个字符模式会在字符串中进行匹配.在Ruby中,通常在斜线之间(/pattern/)编写模式(pattern)来创建正则表达式.同时,Ruby就是Ruby,正则表达式是对象并且可以当作对象来操作. 比如,可以使用如下的正则表达式来编写模式,它会匹配包含Perl或Pytho

  • 详解Ruby中正则表达式对字符串的匹配和替换操作

    正则匹配 说起Ruby当然要提起它的正则表达式机制,正则表达式作为一个强大的匹配语言已经越来越多的使用到不同的领域当中,从字符串验证,匹配,到网页抽取等.虽然有些人诟病与正则表达式的匹配效率,但是考虑到正则的强大匹配能力也就无所谓了. 说起Ruby正则表达式不就不能不说起Ruby的=~和match两种匹配方式,我们还是用实例来说明一下这两种匹配方式的区别吧.先来说一说=~的用法吧: message="afhadhffkdf414j" regex=/[a-z](\d{3})[a-z]/

  • 详解Python中神奇的字符串驻留机制

    目录 1 什么是字符串驻留机制 2 如何使用字符串驻留机制 3 简单拼接驻留, 运行时不驻留 4 总结 5 全部代码 今天有一个初学者在学习Python的时候又整不会了. 原因是以下代码: a = [1, 2, 3] b = [1, 2, 3] if a is b: print("a and b point to the same object") else: print("a and b point to different objects") 运行结果是a an

  • 详解SpringMVC中的日期处理和文件上传操作

    目录 日期格式处理 日期格式处理 创建自定义日期转换器 配置自定义转换器 文件上传下载 文件上传 文件下载 日期格式处理 在控制器中使用对象接收数据 前端: <form action="test/add" method="post"> <p>图书名称:<input type="text" name="bookName"/></p> <p>图书作者:<input

  • 详解IIS中URL重写工具的匹配URL-规则模式(rule patterns)

    rule patterns规则模式在IIS的URL重写模块中,是较为关键的设置.只有规则模式的URL匹配成功时,其他的规则才能起到作用.规则模式的匹配URL设置主要是匹配URL中的路径部分,一般使用正则表达式和通配符对URL路径进行匹配,下面会仔细的说明. 首先要了解规则模式是匹配URL中的哪一部分,假设当前有网站的URL地址为http://shiyousan.com/Home/Index?page=1,那么规则模式匹配的部分就是Home/Index,域名的主机部分和参数部分如果要匹配,则需要在

  • 详解Ruby中的单件方法和单件类

    单件方法 Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法 示例代码 str = "just a regular string" def str.title? self.upcase == self end str.title? # => false str.methods.grep(/title?/) # => [:title?] str.singleton_methods #=> [:title?] str.class # => S

  • 详解Ruby中的循环语句的用法

    Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code end 当 conditional 为真时,执行 code.while 循环的 conditional 通过保留字 do.一个换行符.反斜线 \ 或一个分号 ; ,来与 code 分离开. 实例 #!/usr/bin/ruby $i = 0 $num = 5 while $i < $num do puts("

  • 详解Ruby中的方法概念

    Ruby方法跟其他编程语言中的函数非常相似, Ruby方法用于捆绑到一个单元中的一个或多个重复的语句. 方法名称应以小写字母开始.如果一个方法的名称以大写字母开始,Ruby可能会认为这是一个常数,因此可以正确解析调用. 方法应该定义Ruby的之前调用他们,否则会引发一个异常未定义的方法调用. 语法: def method_name [( [arg [= default]]...[, * arg [, &expr ]])] expr.. end 所以,可以定义一个简单的方法如下: def meth

  • 详解Ruby中的代码块及其参数传递

    一,块的声明    块的声明在函数调用之后,用{..}括起来,或do..end封装.{}一般用在单行语句上,do..end用在多行语句上. (1..4).each{|v| print "#{v} "} #输出1 2 3 4 块可以带参数,与函数参数不同,块参数用||封装,当然,可以带多个参数.这些参数怎么定义,实际上是在函数内部定义好的,后面会讲到. 二,块内变量的访问    块内可以访问块外的变量,也就是块外的变量在块内是可见的,如 sum = 0 (1..5).each do |v

  • 详解Ruby中的异常

    异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止. Ruby 提供了一个完美的处理异常的机制.我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型. 语法 begin # - rescue OneTypeOfException #

  • 详解Linux中正则表达式的应用

    1.组成 普通字符:普通字符串,没有特殊含义 特殊字符:在正则表达式中具有特殊的含义 正则表达式中常见的meta字符[特殊字符] 2.POSIX BRE[基本]与ERE[扩展]中都有的meta字符 \ :通常用于打开或关闭后续字符的特殊含义,如(...)[\是转义字符,去掉符号的特殊意义,().{}等在shell中都有特殊的意义] .和以及.的区别: [root@localhost ~]# cat -n test.txt      1  gd      2  god      3      4 

随机推荐