当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : Ruby正则表达式学习笔记一
帖子发表于 : 2008-12-09 20:25 
头像

注册: 2007-05-08 16:26
帖子: 2058
地址: 火星内核某分子内某原子核内
系统: arch
送出感谢: 20
接收感谢: 6
原文: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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: Ruby正则表达式学习笔记一
帖子发表于 : 2008-12-09 20:28 
头像

注册: 2007-05-08 16:26
帖子: 2058
地址: 火星内核某分子内某原子核内
系统: arch
送出感谢: 20
接收感谢: 6
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


_________________
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387


最后由 sevk 编辑于 2009-06-13 10:22,总共编辑了 2 次

页首
 用户资料  
 
3 楼 
 文章标题 : Re: Ruby正则表达式学习笔记一
帖子发表于 : 2008-12-09 20:57 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
突然认真了?


_________________
● 鸣学


页首
 用户资料  
 
4 楼 
 文章标题 : Re: Ruby正则表达式学习笔记一
帖子发表于 : 2008-12-09 21:09 
头像

注册: 2007-05-08 16:26
帖子: 2058
地址: 火星内核某分子内某原子核内
系统: arch
送出感谢: 20
接收感谢: 6
心血来潮,发几篇.
很久没发了.


_________________
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387


页首
 用户资料  
 
5 楼 
 文章标题 : Re: Ruby正则表达式学习笔记一
帖子发表于 : 2008-12-09 21:59 
头像

注册: 2008-07-21 9:44
帖子: 2371
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
mark,留帖学习。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译