Ruby正则表达式学习笔记一

软件和网站开发以及相关技术探讨
回复
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

Ruby正则表达式学习笔记一

#1

帖子 sevk » 2008-12-09 20:25

原文:http://www.javaeye.com/topic/60620

Ruby的正则表达式以"//"作为基本框架,表达式内容位于"/"之间。表达式返回一个RegExp的对象。
表达式的一般规则:

代码: 全选

  /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","HelloJavaeye"。
  +代表1或多个字符。/a+c/匹配:"abc","abbdrec"等等。
  /d{3}/匹配3个数字。
  /d{1,10}/匹配1-10个数字。
  /d{3,}/匹配3个数字以上。
  /([A-Z]\d){5}/匹配首位是大写字母,后面4个是数字的字符串。


String和RegExp均支持=~和match2个查询匹配方法。在irb中:

代码: 全选

  >> "The alphabet starts with abc" =~ /abc/   
  => 25   
  >> /abc/.match("The alphabet starts with abc.")   
  => #<MatchData:0x1b0d88>
可以看出,如果能够匹配,=~返回匹配的字符串位置,而match返回一个MatchData对象。如果不匹配返回nil。

MatchData可以取出其中符合各个子匹配的内容。看下面的例子:

We have a String : Peel,Emma,Mrs.,talented amateur
The order of the name : last name,first name, title, occupation
正则表达式为: /[A-Za-z]+,[A-Za-z]+,Mrs?\./

irb中:

代码: 全选

   >> /[A-Za-z]+,[A-Za-z]+,Mrs?\./.match("Peel,Emma,Mrs.,talented amateur")
  => #<MatchData:0x401f0a6c>
但是我们想从匹配正则表达式的String里面只取出last name和title相关的字符串,那么正则表达式可以如下:

代码: 全选

   /([A-Za-z]+),[A-Za-z]+,(Mrs?\.)/
注意([A-Za-z]+) 和 (Mrs?\.),执行下面的代码:

代码: 全选

  >> /([A-Za-z]+),[A-Za-z]+,(Mrs?\.)/.match("Peel,Emma,Mrs.,talented amateur")
  => #<MatchData:0x401e0a7c>
  >> puts "Dear #{$2} #{$1},"
  => Dear Mrs. Peel
()中的表达式就是子表达式。

下面的代码和上面效果一样,

代码: 全选

  m = /([A-Za-z]+),[A-Za-z]+,(Mrs?\.)/.match("Peel,Emma,Mrs.,talented amateur")
  puts "Dear #{m[2]} #{m[1]},"
这里m[0]返回匹配主表达式的字符串。

下面的方法是等同的:
m[n] == m.captures[n]

一些相关的方法,看下面的代码例子:

string = "My phone number is (123) 555-1234."
phone_re = /\((\d{3})\)\s+(\d{3})-(\d{4})/
m = phone_re.match(string)
print "The part of the string before the part that matched was:"
puts m.pre_match
print "The part of the string after the part that matched was:"
puts m.post_match
print "The second capture began at character "
puts m.begin(2)
print "The third capture ended at character "
puts m.end(3)

Output:

The string up to the part that matched was: My phone number is
The string after the part that matched was: .
The second capture began at character 25
The third capture ended at character 33
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

Re: Ruby正则表达式学习笔记一

#2

帖子 sevk » 2008-12-09 20:28

Ruby 正则表达式
2007-04-10 15:01:31
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://blackanger.blog.51cto.com/140924/23298

虽然现在各种高级语言基本都支持了正则表达式,但是貌似Ruby却表现的强烈而又灵活。
正则表达式是一种字符串匹配的模式。可以用来一个串中是否含有一个子串;替换匹配的子串;或者取出匹配的子串等等。。。方便的文本操作!
在Ruby中,创建正则表达式的方式通常是/pattern/或%r{pattern}.
我们可以用Regexp类来new一个正则表达式。new的优点是可以通过字符串来生成正则表达式。这有助于通过配置文件来构造产生表达式。函数原型:

代码: 全选

      Regexp.new(pattern [,options ])
      pattern是模式字符串,options是可选的模式选项,是下面3个常量的组合。
     1.       EXTENDED :忽略空格和换行符
     2 .       IGNORECASE :忽略大小写
     3  .       MULTILINE   :把换行符当成普通字符对待。
 
琐碎的东西:
特殊符号--

代码: 全选

        ( )       标记一个子表达式的开始和结束位置。
                  子表达式可以获取供以后使匹配这些字符,请使用 \( 和 \)。 
       
        []       范围描述符 (比如,[a - z] 表示在 a 到 z 范围内的一个字母), 
                  要匹配 使用 \[。 
      
       {}       标记限定符表达式。要匹配 {,请使用 \{。 
       
        \        将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八义符。 
                  例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(配 "("。 
        
        |         指明两项之间的一个选择。要匹配 |,请使用 \|。 
        
        .         匹配除换行符 \n 之外的任何单字符。要匹配 .,请使用 \. 
     
     非打印字符:
        
        \f          匹配一个换页符。等价于 \x0c。 
        \n         匹配一个换行符。等价于 \x0a。 
        \r          匹配一个回车符。等价于 \x0d。 
        \s         匹配任何空白字符,包括空格、制表符、
        \S        匹配任何非空白字符。等价于 [^ \f\n\r\t\
        \t         匹配一个制表符。等价于 \x09。 
        \w       匹配包括下划线的任何单词字符。等价于 [0-9A-Za-z] 
        \W      匹配任何非单词字符。等价于 '[^A-Za-z0
        \d       匹配一个数字字符。等价于 [0-9]。 [0-9]
        \D      匹配一个非数字字符。等价于 [^0-9]。
        \b       退格符 (0x08) (仅在范围描述符内部时)

限定符:
指定正则表达式给定组件出现的次数。

代码: 全选

      *      (最常见,通配符)前面元素出现 0 或多次。* 等价于{0,}。 
               例如,zo* 能匹配 "z" 以及 "zoo"。 要匹配 * 字符,请使用 \*。 
      +       前面元素出现 1 或多次。+ 等价于 {1,}。
               例如,'zo+' 能匹配 "zo" 以及 "zoo",         但不能匹配 "z"。
               要匹配 + 字符,请使用 \+。 
      ?      前面元素最多出现 1 次;相当于 {0,1}。例如,
             ”do(es)?” 可以匹配 “do” 或 “does” 中的"do" 。要匹配 ? 字符,请使用 \?。 
     {n}  n 是一个非负整数。匹配确定的 n 次。 例如,'o{2}' 不能匹配 "Bob" 中的 'o',
             但是能匹配 "food" 中的两o。 
    {n,} n 是一个非负整数。至少匹配 n 次。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 
           例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。 
 {n,m} m 和 n 均为非负整数,其中 n <= m。前面元素最少出现 n 次,最多现 m 次。
             'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格
            例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。 

定位符:
用来描述字符串或单词的边界,不能对定位符使用限定符。

代码: 全选

     ^          匹配输入字符串的开始位置,除非在方括号表达式中使用,
                此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。    
     $          匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,
               则 $也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 
     \b      匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 
              中的 'er',但不能匹配 "verb" 中的 'er'。 
    \B       匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er' 

优先级:
转义符 --> 圆括号,方括号 ---> 限定符 --->定位符 -->或操作

常用操作符:
1. =~ 检验是否匹配,若匹配则返回匹配处的索引
!~ 检验不匹配,返回true或false(nil)
2. ~匹配$_并返回匹配处的索引。
3. match :返回匹配对象






本文出自 “{ :Alex Space => " Ruby Notes " }” 博客,请务必保留此出处http://blackanger.blog.51cto.com/140924/23298
上次由 sevk 在 2009-06-13 10:22,总共编辑 2 次。
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: Ruby正则表达式学习笔记一

#3

帖子 eexpress » 2008-12-09 20:57

突然认真了?
● 鸣学
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

Re: Ruby正则表达式学习笔记一

#4

帖子 sevk » 2008-12-09 21:09

心血来潮,发几篇.
很久没发了.
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
联系:

Re: Ruby正则表达式学习笔记一

#5

帖子 Jarson » 2008-12-09 21:59

mark,留帖学习。
回复