1. Ruby学习笔记-正则表达式
  2.  
  3. Posted on 2011-11-29 17:55 Glen He 阅读(4998) 评论(0) 编辑 收藏
  4.  
  5. 1.创建正则表达式
  6. a) reg1 = /^[a-z]*$/ #将模式的定义放在两个正斜杠之间,返回一个Regexp对象
  7. b) reg2 = Regexp.new(‘^[a-z]*$’) #创建一个Regexp对象
  8. c) reg3 = %r{^[a-z]*$} #使用前置的%r
  9.  
  10. 2.匹配正则式: StringRegexp都支持以下两个方法
  11. a) match方法: 匹配成功时返回MatchData类的一个实例;否则返回nil
  12. b) =~ 操作符: 匹配成功,返回一个索引(integer);否则,返回nil
  13. 例:
  14. puts( /abc/ =~ 'abc' ) #=>return 0
  15. puts( /abc/ =~ 'cdg' ) #=>return nil
  16. puts( /abc/.match('abc') ) #=>return abc
  17. puts( /abc/.match('cdg') ) #=>return nil
  18.  
  19. 3.匹配组
  20. Ruby正则表达式中,可以用正则式匹配一个或多个子字符串;方法是将正
  21. 则式用小括号括起来;使用小括号指定的获取子字符串,可以将匹配的字符串保存;如下正则式中有两个组(hi)和(ho):
  22.   /(hi).*(h...o)/ =~ "The word 'hi' is short for 'hello'."
  23. 匹配成功时, 会把匹配的值赋给一些变量(正则式中有多少组就有多少变量), 这些变量可以通过$1,$2,$3…的形式访问;如果执行上面的那行代码,可以使用$1,$2来访问变量:
  24. print ( $1, " ", $2, "\n" ) #=> hi hello
  25.  
  26. Note: 如果整个正则式匹配不成功,那么就不会就有变量被初始化, 而是返回nil.
  27.  
  28. 4. MatchData类型
  29. 前面也提到过了,使用=~时返回的是一个整数或nil, 面使用match方法时会返回MatchData对象, 它包含了匹配模式的结果;乍一看,很像是字符串:
  30.    puts( /cde/.match('abcdefg') ) #=> cde #=>cde
  31. puts( /cde/=~('abcdefg') ) #=> cde   #=>2
  32. 实际上, 它是MatchData类的一个实例且包含一个字符串:
  33. p( /cde/.match('abcdefg') )    #=> #<MatchData: “cde” >
  34. 可以使用MatchData对象的to_acaptures方法返回包含其值的一个数组:
  35. x = /(^.*)(#)(.*)/.match( 'def myMethod    # This is a very nice method' )
  36. x.captures.each{ |item| puts( item ) }
  37. 上面代码会输出:
  38. def myMethod
  39. #
  40. This is a very nice method
  41.  
  42. Note: captures to_a方法有一点点区别,后者会包含原始串
  43. x.captures #=>["def myMethod ","#"," This is a very nice method"]
  44. x.to_a #=>["def myMethod # This is a very nice method","def myMethod ","#"," This is a very nice method"]
  45.  
  46. 5. Pre & Post 方法
  47. a) pre_match或($`): 返回匹配串前的串
  48. b) post_match或($'): 返回匹配串后的串
  49.   x = /#/.match( 'def myMethod # This is a very nice method' )
  50.   puts( x.pre_match ) #=> def myMethod
  51.   puts( x.post_match ) #=> This is a very nice method
  52.  
  53. 6. 贪婪匹配
  54. 当一个字符串包含多个可能的匹配时,有时可能只想返回第一个匹配的串;
  55. 有时可能想返回所有匹配的串,这种情况就叫贪婪匹配;符号*(0 or more) 和 + (1 or more)可以用来进行贪婪匹配。使用符号? (0 or 1) 进行最少匹配;
  56. puts( /.*at/.match('The cat sat on the mat!') )   #=> returns: The cat sat on the mat
  57.    puts( /.*?at/.match('The cat sat on the mat!') )  #=> returns: The cat
  58.  
  59. 7. 字符串中的方法
  60. a) =~ 和match: 用法同Regexp.
  61. b) String.scan(pattern):尽可能多的去匹配,并把第一个匹配添加到数组中.
  62.   TESTSTR = "abc is not cba"
  63.   b = /[abc]/.match( TESTSTR )   #=> MatchData: "a" puts( "--scan--" )
  64.   a = TESTSTR.scan(/[abc]/) #=> Array: ["a", "b", "c", "c", "b", "a"]
  65. 此外,还可以给sacn方法传递一个block:
  66. a = TESTSTR.scan(/[abc]/){|c| print( c.upcase ) } #=> ABCCBA
  67.  
  68. “fjkdlasjfldjffjladsjflka;jd".scan(/(f)(j)k/){|t| puts "#{t}>>>>>>>>>>>>>"}
  69. ["f", "j"]>>>>>>>>>
  70. 如果正则当中有括号,t代表的是由匹配到括号中的模式的值组成的数组,
  71. 如果没有括号,t代表匹配整个模式的值
  72.  
  73. c) String.split(pattern):基于pattern来分割原串并返回一个数组;如果pattern为空(//),就把原串分割为字符;
  74.   s = "def myMethod   # a comment"
  75.   p( s.split( /m.*d/ ) )  # => ["def ", " # a comment"]
  76.   p( s.split( /\s/ ) )  #=> ["def", "myMethod", "#", "a", "comment"]
  77.   p( s.split( // ) )   # => ["d", "e", "f", " ", "m", "y", "M", "e", "t", "h", "o", "d", " ", "#", " ", "a", " ", "c", "o", "m", "m", "e", "n", "t"]
  78.  
  79. d) String. slice(pattern):返回匹配的串(原串不变),
  80. String. Slice!(pattern):返回匹配的串并在原串删除匹配的串(修改了原串的值)
  81.   s = "def myMethod    # a comment "
  82.   puts( s.slice( /m.*d/ ) )    #=> myMethod
  83.   puts( s )    #=> def myMethod # a comment
  84.   puts( s.slice!( /m.*d/ ) )    #=> myMethod
  85.   puts( s ) #=> def # a comment
  86.  
  87. 8.正则表达式匹配规则
  88.  
  89. 规则
  90. 说明
  91. /a/
  92. 匹配字符a
  93. /\?/
  94. 匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.
  95. .
  96. 匹配任意字符,例如/a./匹配ab和ac。
  97. /[ab]c/
  98. 匹配ac和bc,[]之间代表范围,例如:/[a-z]/ , /[a-zA-Z0-9]/。
  99. /[^a-zA-Z0-9]/
  100. 匹配不在该范围内的字符串
  101. /[\d]/
  102. 代表任意数字
  103. /[\w]/
  104. 代表任意字母,数字或者_
  105. /[\s]/
  106. 代表空白字符,包括空格,TAB和换行
  107. /[\D]/,/[\W]/,/[\S]/
  108. 均为上述的否定情况
  109. ?
  110. 代表0或1个字符
  111. *
  112. 代表0或多个字符
  113. +
  114. 代表1或多个字符
  115. /d{3}/
  116. 匹配3个数字
  117. /d{1,10}/
  118. 匹配1-10个数字
  119. d{3,}/
  120. 匹配3个数字以上
  121. /([A-Z]\d){5}/
  122. 匹配首位是大写字母,后面4个是数字的字符串
  123.  
  124. . 匹配不到 \n 单独的一个反斜杠不能作为任何合法的字符 转义字符计算字符串长度时只能计作一个字符
  125. 字符串“abc\0xyz”:其中有一个转义字符'\0',它是字符串结束符,所以,当用函数strlen来测试该字符串的长度时,结果应该为4(而不是8)。
  126.  
  127. str= "<p>一个反斜杠不能作为\n</p>"
  128. str.scan(/<p>.*?\n<\/p>/) 返回[] 因为其中有\n .无法匹配 只要字符串当中出现了\n 实用.去匹配就返回nil

个人微信:hellocongzhi,验证信息:博客园同学,欢迎随时交流沟通技术心得

ruby 正则表达式的更多相关文章

  1. 雷林鹏分享:Ruby 正则表达式

    Ruby 正则表达式 正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找其他字符串或字符串集合. 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的 ...

  2. ruby 正则表达式Regexp

    ruby正则表达式在线编辑器:rubular 一般规则: /a/匹配字符a.      /\?/匹配特殊字符?.特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), + ...

  3. ruby 正则表达式 匹配中文

    1.puts /[一-龥]+/.match("this is 中文")                 =>中文 2.str2="123中文"puts / ...

  4. ruby 正则表达式 ruby-doc原文

    原文链接:http://www.ruby-doc.org/core-1.9.3/Regexp.html Regexp A Regexp holds a regular expression, used ...

  5. ruby 正则表达式 匹配规则

  6. ruby 正则表达式 匹配所有符合规则的信息

    假设一个字符串当中有很多符合规则的信息,下面的例子可以把所有匹配到的结果打印出来: message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew1 ...

  7. 初识Ruby

    以下为看<七周七语言>的第一课,找到答案,参考资料来源于http://book.douban.com/annotation/27705657/ Ruby API文档在这里http://ru ...

  8. 【Ruby】【高级编程】正则

    #[[正则]]=beginsub 和 gsub 及它们的替代变量 sub! 和 gsub! 是使用正则表达式时重要的字符串方法.所有这些方法都是使用正则表达式模式执行搜索与替换操作.sub 和 sub ...

  9. action mailbox

    Action Mailer Basics和Action Mailbox Basics:邮件系统. https://edgeguides.rubyonrails.org/action_mailbox_b ...

随机推荐

  1. Scut游戏服务器引擎之Unity3d接入

    Scut提供Unity3d Sdk包,方便开发人员快速与Scut游戏服务器对接: 先看Unity3d示例如下: 启动Unity3d项目 打开Scutc.svn\SDK\Unity3d\Assets目录 ...

  2. DIY树莓派之随身工具箱

    摆弄树莓派有一年多了,在这里把经验分享给大家,少走弯路. 先放图两张. 搭建目的: wifi信号中转站\网站服务器\IC卡渗透测试\中间人\otr… 基于树莓派3 系统为Kali Linux 2017 ...

  3. &lt;LeetCode OJ&gt; 83. Remove Duplicates from Sorted List

    83. Remove Duplicates from Sorted List Total Accepted: 94387 Total Submissions: 264227 Difficulty: E ...

  4. Android性能优化Google课程翻译一:Render----OverDraw实战

    Context 近期实战了下OverDraw,加深了下理解.在上篇文章里Android性能优化Google课程翻译一:Render----OverDraw 写过详细方法. OverDraw解决方法离不 ...

  5. SAS学习经验总结分享:篇三—SAS函数

    SAS函数学习 文章为原创,禁止复制或转载,转载请标明出处, http://www.cnblogs.com/smallcrystal/p/4842346.html 1.函数输写格式: 1)一般书写格式 ...

  6. SQLAlchemy使用笔记--SQLAlchemy ORM(三)

    參考: http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#eager-loading 预先载入 前面的代码,由于是lazy load.当我 ...

  7. QTreeWidget 的用法

    Qt QTreeWidget 新建一个Qt Widgets Application,拖拽一个Tree Widget 到 ui 界面上,最后实现的效果如下: 添加代码 //test.h //在头文件里添 ...

  8. Selenium详解

    自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScript渲染的问题. 主要是操控流量器,让浏览器做一些点击啊.加载渲染js啊,之类的.

  9. phpdoctor 安装,配置,生成文档

    window 下安装phpdoctor 1 安装php,设置环境变量path ,把php 的安装路径加上,比如php 安装在d:/php5/ 2下载phpdoctor,可以去官网下载 http://p ...

  10. 前端标签--js--css大致思路

    html标签语言在块级和内联标签的基础上进行页面的设计,设计的时候主要是注意标签块间的距离位置等信息,设计盒子的浮动,盒子的位置,盒子之间的联系. 在设计网页之前一定要判断好该设计多少个盒子,什么样的 ...