`
tudopi
  • 浏览: 2954 次
  • 性别: Icon_minigender_2
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

ruby正则表达式

阅读更多

一、Regexp类的一些方法:

    Regexp.new/compile (string/regexp,[options,[lang]]) : 构造一个正则表达式对象。第一个参数是一个字符串或者正则表达式;第二个参数是 正则表达式修饰符的按位OR。

    Regexp.escape/quote (string) : 对正则表达式中的特殊字符进行转义。如:

 

Regexp.escape('\\*?{}.')   #=> \\\\\*\?\{\}\.

 rxp.match (str) : 返回一个表示匹配结果的MatchData 对象。如果没有匹配则返回nil

 

str = "a123b456c789"
refs = /(a\d+)(b\d+)(c\d+)/.match(str)
puts refs[0]   # "a123b456c789" 
puts refs[1,3]  # ["a123","b456","c789"]
refs.to_a.each {x| x}   # MatchData对象不是数组,在进行迭代前要调用to_a方法将其转换为一个数组。

 也可以使用全局变量$1,$2等引用匹配结果:

 

refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','b456','c789'

 

在sub、gsub等方法中, 不能使用$1等来引用结果,因为这些参数在调用方法前就已经计算好。这时,可以采用特殊编码\1,\2等:

 

refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','b456','c789'
"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, '1st=\1, 2nd=\2, 3rd=\3')   # 1st=a123, 2nd=b456, 3rd=c789
"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, "1st=\\1, 2nd=\\2, 3rd=\\3")   # 1st=a123, 2nd=b456, 3rd=c789
# 上面两个sub方法中,第一个使用的是单引号;第二个是双引号,需要使用双语义

MatchData对象还有以下一些有用的方法:

1. begin(n) : 返回第n个匹配开头的偏移量

2. end(n) : 返回第n个匹配结束的偏移量(等于第n+1个匹配的开头偏移量)

3. offset(n) : 返回一个包含第n个匹配开头和结束偏移量的数组

4. pre_match : 返回匹配子字符串前面的字符串部分

5. post_match : 返回匹配子字符串后面的字符串部分

 

 

二、一些常用的标记

1.  ^$   : 行或字符串开头/结尾(注意:匹配单行的行头/行尾)。

 
src = "abc\ndef\nghi"
/^abc/ =~ src  #0
/^def/ =~ src   #4
/def$/ =~ src   #4
/ghi$/ =~ src  #8

2. \A\Z : 整个字符串的开头/末尾或最后的换行符前

     \z : 基本同 \Z,但是不能匹配最后的换行符

 

src = "abc\ndef\nghi"
/\Aabc/ =~ src  #0
/\Adef/ =~ src   #nil
/def\Z/ =~ src   #nil
/ghi\Z/ =~ src  #8
/ghi\z/ =~ src  #8
src << "\n"
/ghi\Z/ =~ src  #8
/ghi\z/ =~ src  #nil

3. \b : 单词边界(在[]外); \B : 非单词边界

 

src = "this is a test"
src.gsub(/\b/, '|')  # "|this| |is| |a| |test|"
src.gsub(/\B/, '-')  # "t-h-i-s i-s a t-e-s-t"

4. {?=} : 正预查 ,当匹配子字符串sub后面接着的字符串与预查中=号后面的字符串匹配时,sub才匹配成功;{?!}: 负预查,当匹配子字符串sub后面接着的字符串与预查中=号后面的字符串不匹配时,sub才匹配成功。

 

/(a\d+)(?=b)(b\d+)(c\d+)/.match("a123b456c789")    # ['a123','b456','c789']
 /(a\d+)(?=c)(b\d+)(c\d+)/.match("a123b456c789")    # nil
 /(a\d+)(?=b)(\d+)(c\d+)/.match("a123b456c789")     # nil

 /(a\d+)(?!c)(b\d+)(c\d+)/.match("a123b456c789")    # ['a123','b456','c789'

5. () : 子表达式编组; (?:) : 非捕获组

 

refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','b456','c789'

refs = /(a\d+)(?:b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'"  # 'a123','c789','nil'

6. 字符类:包括在方括号[]中的一组字符,其中每一个子匹配是任意一个字符。

    (1) ^用于字符类的开头时有特殊意义,它对字符列表取反。

    (2) 像.和?之类的元字符在字符类中没有特殊含义,表示自身代表的字符。而\n这样的转义序列仍然有效。

    (3) 连字符-用于字符类的开头或结尾,脱字符^用于字符类的中间时,没有特殊含义,只表示自身;左括号[和右括号]用于字符类中时,也是如此,而且还必须显示进行转义。

 

/[abc]/ =~ "abcd"   #0
/[^abc]/ =~ "abcd"   #3

/[.?abc]/ =~ ".?"   #0

/[-^\[\]]/ =~ "^" #0

       7. 几个修饰符的介绍

           (1) i    :  正则表达式不区分大小写

           (2) :  只执行一次表达式替换

           (3) m   :  多行模式(句点匹配换行)

           (4) x    :  扩展正则表达式(允许空白、注释)

 

 

三、一些常用正则表达式实例

1. 匹配IP地址

num = /\d|[01]?\d\d|2[0-4]\d|25[0-5]/
ip = /^(#{num}\.){3}#{num}$/

ip =~ '192.168.0.50'  # 0
ip =~ '192.168.0.500'  # nil

2. 匹配email地址

before_at = /([a-zA-Z0-9]+(_?[a-zA-Z0-9])+)/
after_at = /[a-zA-Z]+(-?[a-zA-Z])+(\.[a-zA-Z]+)+/
email = /^(#{before_at}@#{after_at})$/

email =~ 'abc_123@xyz.com.cn' #0
email =~ 'abc_123@xyz.com' #0
email =~ 'abc_@xyz.com.cn' #nil
email =~ 'abc_123@xy-z.com.cn' #0
email =~ 'abc_123@xyz-.com.cn' #nil

3. 匹配时间/日期类型(yyyy.mm.dd hh:mm:ss)

 

yyyy = /[1-9]\d\d\d/   
mm = /0?[1-9]|1[12]/   
dd = /0?[1-9]|[12]\d|3[01]/   
hh = /[01]?[1-9]|2[0-4]/   
MM = /[0-5]\d/   
ss = /[0-5]\d/   
date_time = /^(#{yyyy}\.#{mm}\.#{dd}) (#{hh}:#{MM}:#{ss})$/   
  
date_time =~ '2008.8.27 22:12:10'  # 0   
date_time =~ '2008.8.27 22:12:60'  # nil  

 

分享到:
评论

相关推荐

    ruby正则表达式规则

    ruby正则表达式规则 ruby中经常用到的正则表达式使用方法

    正则表达式经典实例

    对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,《正则表达式经典实例》给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。...

    精通正则表达式 中英文

    如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MysQL、VB.NET和c#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...

    《正则表达式经典实例》扫描版

    即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...

    精通正则表达式(第三版)

    如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MysQL、VB-NET和c#(以及.NETFramework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...

    精通正则表达式(第三版)

    如今,正则表达式已经成为众多语言及工具--Perl、PHP、Java、Python、Ruby、MysQL、VB-NET和c#(以及.NETFramework中的任何语言)--中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本处理。...

    正则表达式经典实例.pdf

    对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,本书给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。  本书的读者对象是对...

    正则表达式完整高清版

    《正则指引》针对作者在开发中遇到的实际问题,以及其他开发人员咨询的问题,总结出一套使用正则表达式解题的办法,并通过具体的例子指导读者拆解、分析问题。全书分为三大部分:第一部分主要讲解正则表达式的基础...

    [精通正则表达式(第3版)]中文版.(美)Jeffrey.E.F.Friedl-part1.rar

    如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MySQL、VB.NET和C#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...

    精通正则表达式(第3版) 英文版

    如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MySQL、VB.NET和C#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...

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

    在编写puppet的pp文件中,会用到很多ruby的正则表达式,常用的正则如下: 正则表达式: [codesyntax lang=”ruby”] {}: 重复次数(如 {4}表示前面的会重复出现恰好4次) {m,n}: 前面元素最少出现m次,最多出现n次 []...

    正则表达式经典实例.(美)高瓦特斯,(美)利维森.pdf

    本书讲解了基于8种常用的...对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,本书给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。

    精通正则表达式~~~

    精通正则表达式第三版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于...

    正则表达式经典实例中文版 (美)高瓦特斯

    《正则表达式经典实例》对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET的实例。  《正则表达式经典实例》主要包括以下...

    正则表达式框架OgreKit.zip

    OgreKit 是一款为 Cocoa 开发的正则表达式框架,该框架提供了一个与 Ruby 使用的相同的正则表达式引擎与一个高层次的 GUI 查找面板。可以在这里获取源码。 OgreKit 使用 Oniguruma/Onigmo 正则表达式引擎。...

Global site tag (gtag.js) - Google Analytics