ruby 正则表达式

Ruby学习笔记-正则表达式

Posted on 2011-11-29 17:55 Glen He 阅读(4998) 评论(0) 编辑 收藏

1.创建正则表达式
a)  reg1 = /^[a-z]*$/                             #将模式的定义放在两个正斜杠之间,返回一个Regexp对象
b)  reg2 = Regexp.new(‘^[a-z]*$’)         #创建一个Regexp对象
c)  reg3 = %r{^[a-z]*$}                       #使用前置的%r

2.匹配正则式: String和Regexp都支持以下两个方法
a) match方法: 匹配成功时返回MatchData类的一个实例;否则返回nil;
b) =~ 操作符: 匹配成功,返回一个索引(integer);否则,返回nil;
例:
       puts( /abc/ =~ ‘abc‘ )                 #=>return 0
       puts( /abc/ =~ ‘cdg‘ )                #=>return nil
       puts( /abc/.match(‘abc‘) )          #=>return abc
       puts( /abc/.match(‘cdg‘) )          #=>return nil

3.匹配组
在Ruby正则表达式中,可以用正则式匹配一个或多个子字符串;方法是将正
则式用小括号括起来;使用小括号指定的获取子字符串,可以将匹配的字符串保存;如下正则式中有两个组(hi)和(h…o):
  /(hi).*(h...o)/ =~ "The word ‘hi‘ is short for ‘hello‘."
匹配成功时, 会把匹配的值赋给一些变量(正则式中有多少组就有多少变量), 这些变量可以通过$1,$2,$3…的形式访问;如果执行上面的那行代码,可以使用$1,$2来访问变量:
       print ( $1, " ", $2, "\n" ) #=> hi hello

Note: 如果整个正则式匹配不成功,那么就不会就有变量被初始化, 而是返回nil.

4. MatchData类型
前面也提到过了,使用=~时返回的是一个整数或nil, 面使用match方法时会返回MatchData对象, 它包含了匹配模式的结果;乍一看,很像是字符串:
   puts( /cde/.match(‘abcdefg‘) ) #=> cde           #=>cde
       puts( /cde/=~(‘abcdefg‘) ) #=> cde             #=>2
实际上, 它是MatchData类的一个实例且包含一个字符串:
       p( /cde/.match(‘abcdefg‘) )                         #=> #<MatchData: “cde” >
可以使用MatchData对象的to_a或captures方法返回包含其值的一个数组:
       x = /(^.*)(#)(.*)/.match( ‘def myMethod    # This is a very nice method‘ )
       x.captures.each{ |item| puts( item ) }
上面代码会输出:
       def myMethod
       #
       This is a very nice method

Note: captures 和to_a方法有一点点区别,后者会包含原始串
       x.captures     #=>["def myMethod ","#"," This is a very nice method"]
       x.to_a           #=>["def myMethod # This is a very nice method","def myMethod ","#"," This is a very nice method"]

5. Pre & Post 方法
a)  pre_match或($`): 返回匹配串前的串
b)  post_match或($‘): 返回匹配串后的串
  x = /#/.match( ‘def myMethod # This is a very nice method‘ )
  puts( x.pre_match )            #=> def myMethod
  puts( x.post_match )          #=> This is a very nice method

6. 贪婪匹配
当一个字符串包含多个可能的匹配时,有时可能只想返回第一个匹配的串;
有时可能想返回所有匹配的串,这种情况就叫贪婪匹配;符号*(0 or more) 和 + (1 or more)可以用来进行贪婪匹配。使用符号? (0 or 1) 进行最少匹配;
       puts( /.*at/.match(‘The cat sat on the mat!‘) )    #=> returns: The cat sat on the mat
   puts( /.*?at/.match(‘The cat sat on the mat!‘) )  #=> returns: The cat

7. 字符串中的方法
a)  =~ 和match: 用法同Regexp.
b)  String.scan(pattern):尽可能多的去匹配,并把第一个匹配添加到数组中.
  TESTSTR = "abc is not cba"
  b = /[abc]/.match( TESTSTR )           #=> MatchData: "a" puts( "--scan--" )
  a = TESTSTR.scan(/[abc]/)                   #=> Array: ["a", "b", "c", "c", "b", "a"]
此外,还可以给sacn方法传递一个block:
      a = TESTSTR.scan(/[abc]/){|c| print( c.upcase ) } #=> ABCCBA

“fjkdlasjfldjffjladsjflka;jd".scan(/(f)(j)k/){|t| puts "#{t}>>>>>>>>>>>>>"}
["f", "j"]>>>>>>>>>
如果正则当中有括号,t代表的是由匹配到括号中的模式的值组成的数组,
如果没有括号,t代表匹配整个模式的值

c)  String.split(pattern):基于pattern来分割原串并返回一个数组;如果pattern为空(//),就把原串分割为字符;
  s = "def myMethod      # a comment"
  p( s.split( /m.*d/ ) )      # => ["def ", " # a comment"]
  p( s.split( /\s/ ) )           #=> ["def", "myMethod", "#", "a", "comment"]
  p( s.split( // ) )             # => ["d", "e", "f", " ", "m", "y", "M", "e", "t", "h", "o", "d", " ", "#", " ", "a", " ", "c", "o", "m", "m", "e", "n", "t"]

d) String. slice(pattern):返回匹配的串(原串不变),
    String. Slice!(pattern):返回匹配的串并在原串删除匹配的串(修改了原串的值)
  s = "def myMethod                 # a comment "
  puts( s.slice( /m.*d/ ) )          #=> myMethod
  puts( s )                                 #=> def myMethod # a comment
  puts( s.slice!( /m.*d/ ) )        #=> myMethod
  puts( s )                                    #=> def # a comment

8.正则表达式匹配规则

规则
说明
/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个字符
*
代表0或多个字符
+
代表1或多个字符
/d{3}/
匹配3个数字
/d{1,10}/
匹配1-10个数字
d{3,}/
匹配3个数字以上
/([A-Z]\d){5}/
匹配首位是大写字母,后面4个是数字的字符串

 . 匹配不到 \n        单独的一个反斜杠不能作为任何合法的字符   转义字符计算字符串长度时只能计作一个字符
字符串“abc\0xyz”:其中有一个转义字符‘\0‘,它是字符串结束符,所以,当用函数strlen来测试该字符串的长度时,结果应该为4(而不是8)。

str= "<p>一个反斜杠不能作为\n</p>"
str.scan(/<p>.*?\n<\/p>/)   返回[]   因为其中有\n  .无法匹配       只要字符串当中出现了\n  实用.去匹配就返回nil
时间: 2024-10-30 22:31:25

ruby 正则表达式的相关文章

ruby 正则表达式Regexp

http://ruby-doc.org/core-2.1.2/Regexp.html Regexp A Regexp holds a regular expression, used to match a pattern against strings. Regexps are created using the /.../ and %r{...} literals, and by the Regexp::new constructor. Regular expressions (regexps

Ruby 教程

Ruby 教程python-miniRuby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发.在 Ruby 社区,松本也被称为马茨(Matz).Ruby 可运行于多种平台,如 Windows.MAC OS 和 UNIX 的各种版本.学习本教程,您将对 Ruby 有一个全面的了解.现在开始学习 Ruby!谁适合阅读本教程?本教程有助于初学者理解 Ruby 语言基础知识及基本概念.阅读

Puppet正则表达式(十七)

puppet支持标准的ruby正则表达式. 正则表达式的参数匹配项: []:用于描述范围(如[a-z],表示范围a~z之间.) ():用于包含正则表达式. \w:用于描述字母或数字,相当于[0-9a-zA-Z] \W:非字母或数字. \s:匹配[\t\n\r\f],其中(\t)为制表符.(\r)为回车符.(\n)为换行符.(\f)为换页符,\s表示匹配这些符号的简写方式. \S:匹配非空字符. \d:匹配[0-9]数字. \D:匹配非数字 \b:匹配退格符. \B:非字边界. *:前面元素出现0

ruby正则表达以及匹配替换

ruby正则表达式分两种,一种是转义的,一种是不转义的,不转义的我还没用过,所以不知道效果怎么样,这里只讲讲转义的,大体来讲,所有的表达式都被包含在两个/中间,中括号[]内的代表或,就是任意一个,单个字符匹配使用的是\?(?代表要匹配的特殊字符,比如我要匹配右中括号,那么我就可以写\])恩,基本上就这样,下面给出具体范例: /a/ :匹配字符a /[Aa]b/:匹配字符Ab或者ab /\s/匹配所有的空白,比如空格.换行.tab键 /\n/匹配新的一行 /\r/匹配换行,相当于enter键,注:

正则表达式 - 简介

正则表达式 - 简介 除非您以前使用过正则表达式,否则您可能不熟悉一些术语.但是,毫无疑问,您已经使用过不涉及脚本的某些正则表达式概念. 例如,您很可能使用 ? 和 * 通配符来查找硬盘上的文件.? 通配符匹配文件名中的 0 个或 1 个字符,而 * 通配符匹配零个或多个字符.像 data(\w)?.dat 这样的模式将查找下列文件: data.dat data1.dat data2.dat datax.dat dataN.dat 使用 * 字符代替 ? 字符扩大了找到的文件的数量.data*.

Puppet安装部署篇(二)

前言:上篇写了结合svn钩子做版本控制puppet master代码,后续的操作都要在windows客户端使用svn完成操作,如果直接在服务器端操作,svn的钩子就会出现同步失败和不同步的问题. 解决:pkill svn && svnserve -d -r /data/puppet_co/  #重启操作 1.安装完puppet查看puppet的主配置文件目录: #puppet agent --configprint confdir /etc/puppet 2.设置puppet/puppet

Logstash+elasticsearch+elastic+nignx

注:本系统使用的是Logstash+elasticsearch+elastic+nignx 进行日志分析.展示 1环境版本:... 2 1.1主机:... 2 1.2前提:... 2 2 Logstash配置... 2 3 Kibana与elasticsearch的启动... 6 3.1 elasticsearch. 6 3.2 kibana. 7 4 Nginx的配置:... 7   1环境版本: 操作系统:CentOS 7.2.1511 内核:Linux Logs3.10.0-123.9.3

正则匹配组

# 匹配组# 在Ruby正则表达式中,可以用正则式匹配一个或多个子字符串:方法是将正# 则式用小括号括起来:使用小括号指定的获取子字符串,可以将匹配的字符串保存:如下正则式中有两个组(hi)和(h…o):#     /(hi).*(h...o)/ =~ "The word 'hi' is short for 'hello'."# 匹配成功时, 会把匹配的值赋给一些变量(正则式中有多少组就有多少变量), 这些变量可以通过$1,$2,$3…的形式访问:如果执行上面的那行代码,可以使用$1,

Linux管理员常用网络资源(收集帖)

本文给力,收集的是Linux管理员常用网络资源.笨兔兔想会对各位Linux系统管理员会有用的.如果喜欢,拿走即可. Corntab Corntab是一款简易的网络crontab端,无需安装,轻松创建crontab语句.不用担心格式问题.使用"crontab -e"命令进入后复制crontab即可.我们知道"crontab 命令提交.编辑.列出或除去 cron 作业.一个 cron 作业是一个命令,其运行是由 cron 守护进程在规则的调度间隔执行" 正则表达式 Kv