`

[转]ruby正则表达式

    博客分类:
  • Ruby
 
阅读更多
ruby正则表达式
Posted on 02/21/2012
1.建立正则表达式

使用”//” reg=/ru\/by/ 需要对转义字符转义
使用类方法Regexp.new reg=Regexp.new(“ru/by”) 不需要对转义字符转义
使用%r reg=%r(ru/by)
不需要对转义字符转义

2.正则表达式的一般匹配


/ruby/ =~ "ruby string"
#=>0 返回匹配成功的起始位置

/ruby/.match("string
# 返回匹配成功的字符串


3.匹配行首行尾和字符串首尾

若字符串中有换行符,行尾就是换行符的前面


^ 匹配行首
/^ruby/=~"rubystring"   #=>0
/^ruby/=~"string\nruby" #=>7

$ 匹配行尾
/ruby$/=~"stringruby"        #=>6
/ruby$/=~"stringruby/string" #=>6

\A 匹配字符串首
/\Aruby/=~"rubystring"         #=>0
/\Aruby/=~"string\nrubystring" #=>nil

\Z 匹配字符串尾
/ruby\Z/=~"string\nruby"       #=>7
/ruby\Z/=~"stringruby\nstring" #=>nil


4.指定匹配范围和多选


[ab] 匹配a或b
/[ab]/=~"stringa"     #=>6

[adf] 匹配a、d或f
/[adf]/=~"stringd"    #=>6

[a-z] 匹配a到z
/[a-z]/=~"123r"       #=>3

[A-Za-z] 匹配A到Z和a到z
/[A-Za-z]/=~"123D321" #=>3

[0-9] 匹配0到9
/[0-9]/=~"abc4ef"     #=>3


在[ ]内加入^表示匹配除括号内指定的字符外

[^abc] 匹配除abc之外的字符
/[^abc]/=~"abccb"     #=>nil
/[^abc]/=~"acdf"      #=>2
使用”|”来添加候选字符

/12a|b/.match("123bc")    #=gt;<MatchData "12b">
/12a|b|c/.match("123cd")  #=gt;<MatchData "12c">
5.匹配任意字符

匹配除换行符外地任意字符

/./=~"abc"     #=>0
6.反斜杠字母


\s 匹配空白、换行符、定位字符、换页符
/a\sc/=~"abca c"  #=>3

\S 匹配除空白、换行符、定位符、换页符之外的字符
/a\Sc/=~"a\ncabc" #=>3

\d 匹配数字
/a\dc/=~"abca1c"  #=>3

\D 匹配除数字之外的字符
/a\Dc/=~"a1cabc"  #=>3

\w 匹配数字、字母和"_"
/a\wc/=~"a&cabc"  #=>3

\W 匹配除数字、字母和"_"之外的字符
/a\Wc/=~"abca&c"  #=>3

\b 匹配单词的开始或结尾
/\bis/=~"this ist" #=>5
/is\b/=~"this ist" #=>2

\B 与\b相对
/\Bis/=~"this ist" #=>2
/is\B/=~"this ist" #=>5


7.转义字符的转义

在转义字符”^”,”$”,”["等前面加上"\",就能对转义字符进行转义来表示它自己

/abc\$/=~"abc"   #=>nil
/abc\$/=~"abc$"  #=>0
通过quote方法来将转义字符变成普通字符

reg1=Regexp.new("a*b")
reg2=Regexp.new(Regexp.quote("a*b"))
reg1=~"123a*b"   #=>nil
reg2=~"123a*b"   #=>3
8.反复的匹配


* 出现0次或以上
/a*b/.match("123aaab") #=><MatchData "aaab">
/a*b/.match("123b")    #=><MatchData "b">

+ 出现1次或以上
/a+b/.match("123aaab") #=><MatchData "aaab">
/a+b/.match("123b")    #=>nil
/a+b/.match("123ab")   #=><MatchData "ab">

? 出现0次或1次
/a?b/=~"123aaab"       #=>5
/^a?b/=~"aaab"         #=>nil
/.?b/.match("123b")    #=><MatchData "3b">


ruby的正则表达式匹配时是贪婪匹配,即匹配时尽可能匹配更多的字符

/a.*b/.match("a123bcab") #=><MatchData "a123bcab:>
可通过添加"?"来变成不贪婪匹配

*? 0次或以上的不贪婪匹配
+? 1次或以上的不贪婪匹配
/a.*?b/.match("a123bcab") #=><MatchData "a123b">
使用()群组来反复

/(ab)*/=~"123abab"       #=>0
/(ab)*/.match("123abab") #=><MatchData "" 1:nil>
/(ab)+/=~"123abab"       #=>3
/(ab)+/.match("123abab") #=><MatchData "abab" 1:"ab">
使用{}来为制定的字符取得多次匹配


/a{n}/ 匹配n个a
/a{3}/.match("123aaab")     #=><MatchData "aaa">

/a{n,} 匹配n或n以上个a
/a{3,}/.match("123aaaab")   #=><MatchData "aaaa">

/a{n,m} 匹配n到m个a
/a{1,3}b/=~"123b"           #=>nil
/a{1,3}b/=~"123ab"          #=>3
/a{1,3}b/=~"123aab"         #=>3
/a{1,3}b/=~"123aaab"        #=>3
/a{1,3}b/=~"123aaaab"       #->nil


9.正则表达式的选项


通过直接在添加"/.../"后面,如/Ab/i

i 忽略大小写
/ab/i=~"12AB"               #=>2

m 多行匹配,能让"."匹配换行符
/a.b/m=~"12a\nbc"           #=>2

x 忽略空白、换行符,并忽略"#"后面的字符,这时可使用#来添加注释了
/a b/=~"12ab"               #=>nil
/a b/x=~"12ab"              #=>2
/a b#def/x.match("12abdef") #=><MatchData "ab">

s,e,u,n 指定字符编码,s是Shift-JIS,e是EUC-JP,
u是UTF-8,n是none即不考虑字符编码



通过在字符前面添加选项,选项后面的字符都被选项影响,
而选项前面的字符则不受影响

(?i)
/A(?i)bc/=~"ABC"      #=>0
/A(?i)bc/=~"abc"      #=>nil
/A(?i)b(?-i)c/=~"AbC  #=>nil
/A(?i)b(?-i)c/=~"ABc" #=>0

类似还有(?m),(?x),(?-i)表示不能忽略大小写,
(?-m)表示不能忽略换行符,(?-x)表示不能忽略空白




通过将字符串写入选项内

(?i:)
/A(?i:bc)/=~"ABC"  #=>0

同样,还有(?-i:),(?m:),(?-m:),(?x:),(?-x:)




10.添加注释

除了通过上面所讲,使用x选项来添加注释,还可以使用(?#)

/ab(?#def)/=~"123ab"    #=>3
/\d-(?#这里的"-"不是指范围)\d/=~"ab1-2"  #=>2
11.回溯参照(backreference,反向引用)

回溯参照用来取出字符串中匹配成功的一部分


与正则表达式中的()中所匹配的字符串可用$1,$2,,$3……来取出
取出顺序是从左往右,从外向内
/(a)(.)(b)/.match("123aeb")   #=><MatchData "acb" 1:"a" 2:"e" 3:"b">
p $1 #=>"a"
p $2 #=>"e"
p $3 #=>"c"
/((.)(a))/.match("123abc")    #=><MatchData "3a" 1:"3a" 2:"3" 3:"a">
p $1 #=>"3a"
p $2 #=>"3"
p $3 #->"a"

取出与正则表达式所匹配的字符,匹配的字符的前面,匹配字符的后面
分别用$&,$`(1旁边),$'
/ab/=~"123ab456"     #=>3
p $& #=>"ab"
p $` #=>"123"
p $' #=>"456"

取出MatchData,用$~
/(a)b/=~"123ab"     #=>3
p $` #=>"123"
p $' #=>""
p $& #=>"ab"
p $~ #=><MatchData "ab" 1:"a">

用形如"\num"来匹配群组1,群组2,群组3……群组num的字符
/a(b)\1/=~"abc"      #=>nil
/a(b)\1/=~"abb"      #=>0
/(a)(b)\1\2/=~"abaa" #=>nil
/(a)(b)\1\2/.match("123abab") #=><MatchData "abab" 1:"a" 2:"b">
/(a)(b)\2/=~"abb"    #=>0
/((a)(b))\1/.match("123abab") #=><MatchData "abab" 1:"ab" 2:"a" 3:"b">
/(a|b)\1/=~"ab"      #=>nil
/(a|b)\1/=~"ba"      #=>nil
/(a|b)\1/=~"aa"      #=>0
/(a|b)\1/=~"bb"      #=>0
若要在\num后面添加数字,则必须得给\num添加括号
/a(b)(\1)2/=~"ab12"  #=>nil
/a(b)(\1)2/=~"abb2"  #=>0

使用索引
mat1=/.a/.match("123a")    #=><MatchData "3a">
p mat1[0]   #=>”3a”
p mat1[1]   #nil
mat2=/(.)a/.match(“123a”) #=><MatchData “3a” 1:”3″>
p mat2[0]   #=>”3a”
p mat2[1]   #=>”3″
p mat2[2]   #=>nil

若只想有群组的功能,而没有回溯参照的功能,则可以使用(?:)
/(a)(?:b)(c)/.match(“123abcd”)    #=><MatchData “abc” 1:”a” 2:”c”>


12.(?!exp)和(?=exp)

(?!exp) 匹配后缀不是exp
/ab(?!c)/=~"abc"   #=>nil
/ab(?!c)/=~"abe"   #=>0

(?=exp) 匹配后缀为exp
/ab(?=c)/=~"abc"   #=>0
/ab(?=c)/=~"abe"   #=>nil


13.sub方法和gsub方法

sub方法和gsub方法都是用来取代字符串中字符的方法,
第一个参数指定匹配样式,第二个参数指定想要代入的字符串。
sub方法只会取代第一个匹配成功的字符串,
而gsub方法会取代所有匹配成功的字符串

sub方法,sub!方法
str="abc\n123\456"
str.sub(/\n/,'d')   #=>"abcd123\n456"

gsub方法,gsub!方法
str="abc\n123\n456"
str.gsub(/\n/,'d')  #=>"abcd123d456"


sub方法和gsub方法也可以传入区块

str="ab12ac34ad"
str.gsub(/a./){|mat|
  print "string ",mat,"\n"
  }
#=>
string ab
string ac
string ad
14.scan方法

scan方法会查找字符串中所有匹配的字符,并以数组返回
"12ab34ac56ad".scan(/a./)   #=>["ab","ac","ad"]
scan方法也可以传入区块
"12ab34ac56ad".scan(/a./){|mat|
  print "string ",mat,"\n"
  }
#=&gt
string ab
string ac
string ad
当正则表达式中含有(),则匹配成功的部分会以数组的形式传入区块
"12ab34ac56ad".scan(/(a)(.)/){|mat|
  print mat
  }
#=>
["a","b"]
["a","c"]
["a","d"]
若区块中的变量和正则表达式中的()一样多式,则不会传入数组
"12ab34ac56ad".scan(/(a)(.)/){|m,n|
  print n," after ",m,"\n"
  }
#=>
b after a
c after a
d after a
15.正则表达式的条件判断

if /reg/ =~ "string"
  匹配成功时的动作
else
  匹配失败时的动作
end


转自:http://zzzany.site50.net/http:/zzzany.site50.net/rubyregexp.html
分享到:
评论

相关推荐

    ruby正则表达式规则

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

    正则表达式经典实例

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

    ruby正则表达式

    比较齐全的正则表达式,完全可以满足你平时的各种需要

    精通正则表达式 中英文

    如今,正则表达式已经成为众多语言及工具——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中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...

    精通正则表达式~~~

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

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

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

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

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

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

    《正则表达式经典实例》对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括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