ruby 正则表达式 教程

我们再看一个更有趣的程序.这次我们来测试一个字符串是否和一个由简明模式(concise pattern)编码产生的描述相匹配.

在这些模式(pattern)里,一些字符或字符组合都有独特的意义,包括:

代码如下:

[]  范围描述符 (比如,[a - z] 表示在a 到 z 范围内的一个字母)

\w  字母或数字;相当于 [0-9A-Za-z]

\W  非字母,数字

\s  [ \t\n\r\f]空字符;相当于 [ \t\n\r\f]

\S  非空字符

\d  [0-9]数字;相当于 [0-9]

\D  非数字字符

\b  退格符 (0x08) (仅在范围描述符内部时)

\b  字边界(word boundary) (在范围描述符外部时)

\B  非字边界

*  前面元素出现0或多次

+  前面元素出现1或多次

{m,n}  前面元素最少出现m次,最多出现n次

?  前面元素最多出现1次;相当于 {0,1}

|  与前面或后面的表达式匹配

()  群( grouping)

那些模式中共同使用的古怪词汇叫做正则表达式.就象Perl一样,Ruby也用前斜杠(而不是双引号)将它们括起来.如果你以前从未使用过正则表达式,也许它们看起来除了规则(regular)什么都不是,但花上一点儿时间了解它们是明智的.当你需要对字符串进行模式匹配,查找或其它操作时,它的高效的表达能力能治好你的头痛(并节约很多行代码).

举个例子,设想我们想要测试一个字符串是否符合这样的描述信息"由小写f开头,跟一个大写字母,并可能跟许多非小写字母在后面."如果你是一个老练的C程序员,大概你的头脑里已经装满几十行程序了,对不对?承认吧,你难以控制住自己.在Ruby里,你只需要将你的字符串用正则表达式/^f[A-Z](^[a-z])*$/检验一下就可以了.

那"一个由<>括起来的16位数呢"?没问题.

代码如下:

ruby> def chab(s)   # "contains hex in angle brackets" 
    |    (s =~ /<0(x|X)(\d|[a-f]|[A-F])+>/) != nil 
    | end 
  nil 
ruby> chab "Not this one." 
  false 
ruby> chab "Maybe this? {0x35}"    # wrong kind of brackets 
  false 
ruby> chab "Or this? <0x38z7e>"    # bogus hex digit 
  false 
ruby> chab "Okay, this: <0xfc0004>." 
  true

虽然,初看起来正则表达式挺让人头痛的,但你很快会因能够如此高效地表达出你心中的意思而感到满足.

下面是一个可以帮助你实验正则表达式的小程序,把它存为regx.rb,然后在命令行里输入'ruby regx.rb'运行.

代码如下:

# Requires an ANSI terminal! 
st = "\033[7m" 
en = "\033[m" 
while TRUE   
    print "str> "   
    STDOUT.flush   
    str = gets   
    break if not str   
    str.chop!   
    print "pat> "   
    STDOUT.flush   
    re = gets   
    break if not re   
    re.chop!   
    str.gsub! re, "#{st}\\&#{en}"   
    print str, "\n" 
end 
print "\n"

这个小程序要求输入两次,一次字符串,一次正则表达式.输入的字符串由正则表达式检验,然后用反视高亮度显示所有匹配部分.先别管细节,等会儿就有代码分析.

代码如下:

str> foobar 
pat> ^fo+ 
foobar 
~~~

上面红色部分将在程序输入中以反视表示出.下面的"~~~"行是为了方便那些使用基于字符浏览器的人.

我们再试几个输入:

str> abc012dbcd555
pat> \d
abc012dbcd555

如果让你感到惊讶,看看本页开头部分的那个表格: \d与字母d无关,而是对应于单个数字.

如果有不止一种方法能匹配模式会怎样呢?

str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~

之所以foozbooz被匹配而不只是fooz,是因为一个正则表达符尽可能匹配最长的子串.

下面是一个将冒号分隔的数字时间段从字符串中隔离出来的模式匹配.

str> Wed Feb  7 08:58:04 JST 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb  7 08:58:04 JST 1996

"=~"是一个用于匹配正则表达式的匹配(matching)运算符;它会返回在字符串里找到的匹配的位置,或者返回 nil 表示模式无法匹配.

ruby> "abcdef" =~ /d/
   3
ruby> "aaaaaa" =~ /d/
   nil

(0)

相关推荐

  • 举例初步讲解Ruby中的正则表达式

    正则表达式是一个特殊的字符序列可以帮助匹配或者找到其他字符串或串套,使用的模式保持一个专门的语法. 正则表达式文本是一个模式之间的斜线之间或任意分隔符 %r 如下: 语法: 复制代码 代码如下: /pattern/ /pattern/im    # option can be specified %r!/usr/local! # general delimited regular expression 例如: #!/usr/bin/ruby line1 = "Cats are smarter t

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

    在编写puppet的pp文件中,会用到很多ruby的正则表达式,常用的正则如下: 正则表达式: [codesyntax lang="ruby"] {}: 重复次数(如 {4}表示前面的会重复出现恰好4次) {m,n}: 前面元素最少出现m次,最多出现n次 []: 范围描述符(如 [a-z]表示在a-z范围内的一个字母) \w: 字符或数字,相当于[0-9A-Za-z] \W: 非字母或数字 \s: [\t\n\r\f]空字符,相当于[\t\n\r\f] \S: 非空字符 \d: [0-

  • 详解Ruby中正则表达式对字符串的匹配和替换操作

    正则匹配 说起Ruby当然要提起它的正则表达式机制,正则表达式作为一个强大的匹配语言已经越来越多的使用到不同的领域当中,从字符串验证,匹配,到网页抽取等.虽然有些人诟病与正则表达式的匹配效率,但是考虑到正则的强大匹配能力也就无所谓了. 说起Ruby正则表达式不就不能不说起Ruby的=~和match两种匹配方式,我们还是用实例来说明一下这两种匹配方式的区别吧.先来说一说=~的用法吧: message="afhadhffkdf414j" regex=/[a-z](\d{3})[a-z]/

  • 详细介绍Ruby中的正则表达式

    正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找其他字符串或字符串集合. 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模式,如下所示: /pattern/ /pattern/im # 可以指定选项 %r!/usr/local! # 一般的分隔的正则表达式 实例 #!/usr/bin/ruby line1 = "Cats are smarter than dogs"; line2 = "Dogs also like m

  • 浅析Ruby中的正则表达式的使用

    如果只是需要中查找字符串的 text, 不要使用正则表达式:string['text'] 针对简单的结构, 你可以直接使用string[/RE/]的方式来查询. match = string[/regexp/] # get content of matched regexp first_group = string[/text(grp)/, 1] # get content of captured group string[/text (grp)/, 1] = 'replace' # strin

  • 使用Ruby re模块创建复杂的正则表达式

    例如,考虑下面的匹配日期的正则表达式: 复制代码 代码如下: /\A((?:19|20)[0-9]{2})[\- \/.](0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])\z/ 使用Re之后,正则表达式可以短小易读的表达式为基础,一步一步地构建出来,例如: 复制代码 代码如下: require 're' include Re delim                = re.any("- /.")century_prefix      

  • Ruby中使用正则表达式的基础指引

    正则表达式的内建支持通常只限于脚本语言如Ruby,Perl和awk等,这是一个耻辱:尽管正则表达式很神秘,但它是一个强大的文本处理工具.通过内建而不是通过程序库接口来支持它,有很大的不同. 正则表达式只是一种指定字符模式的方法,这个字符模式会在字符串中进行匹配.在Ruby中,通常在斜线之间(/pattern/)编写模式(pattern)来创建正则表达式.同时,Ruby就是Ruby,正则表达式是对象并且可以当作对象来操作. 比如,可以使用如下的正则表达式来编写模式,它会匹配包含Perl或Pytho

  • Ruby程序中正则表达式的基本使用教程

    Ruby大部分的内置类型都和其它的编程语言很相似.主要有strings,integers,floats,arrays等等.然而,只有脚本语言,如Ruby,Perl,和awk等提供了内置表达式类型的支持.正则表达式尽管比较隐蔽,但却是一个很强大的文本处理工具. 正则表达式是使用指定的模式匹配字符串的一种简单的方法.在Ruby中,创建正则表达式的典型方式是把模式写在两个斜线之间/pattern/. 毕竟,Ruby就是Ruby,正则表达式也是对象,也能像对象般操作. 例如,你可以使用下面的正则表达式写

  • ruby 正则表达式 教程

    我们再看一个更有趣的程序.这次我们来测试一个字符串是否和一个由简明模式(concise pattern)编码产生的描述相匹配. 在这些模式(pattern)里,一些字符或字符组合都有独特的意义,包括: 复制代码 代码如下: []  范围描述符 (比如,[a - z] 表示在a 到 z 范围内的一个字母) \w  字母或数字;相当于 [0-9A-Za-z] \W  非字母,数字 \s  [ \t\n\r\f]空字符;相当于 [ \t\n\r\f] \S  非空字符 \d  [0-9]数字;相当于 

  • 正则表达式教程之模式修正符使用介绍

    之前我们给大家介绍了正则表达式中的定界符.原子和元字符,那么我们关于正则表达式教程的基本语法就剩下了正则表达式中的模式修正符.本节会向大家介绍模式修正符的概念.模式修正符的构成,以及结合实例的模式修正符的演示,大家在学习完本节内容之后,就完全可以读懂正则表达式了. 什么是模式修正符? 1, 模式修正符就是几个字母,我们在每个正则表达式中可以一次使用一个,也可以连续使用多个,每一个具一定的意义. 2, 模式修正符是对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展. 还记得正则表达式的那个

  • 正则表达式教程之匹配一组字符详解

    本文实例讲述了正则表达式教程之匹配一组字符的方法.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.匹配多个字符中的某一个 在上一篇<正则表达式教程之匹配单个字符详解>中的一个匹配以na或sa开头的文本文件例子中,使用的正则表达式是.a.\.txt.如果还有一个文件是cal.txt,那么也将会被匹配到.如

  • 正则表达式教程之重复匹配详解

    本文实例讲述了正则表达式教程之重复匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.有多少个匹配 前面几篇讲的都是匹配一个字符,但是一个字符或字符集合要匹配多次,应该怎么做呢?比如要匹配一个电子邮件地址,用之前说到的方法,可能有人会写出像\w@\w\.\w这样的正则表达式,但这个只能匹配到像a@b.c

  • 正则表达式教程之匹配单个字符详解

    本文实例讲述了正则表达式教程之匹配单个字符.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. java测试代码: /** * 根据正则表达式和要匹配的源文本,输出匹配结果 * @param regex 正则表达式 * @param sourceText 要匹配的源文本 */ public static void

  • 正则表达式教程之前后查找lookaround详解

    本文实例讲述了正则表达式教程之前后查找lookaround.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 在HTML页面中,匹配出一对标签之间的文本,如匹配出页面的标签,即<title>与</title>之间的文本: 文本:<head><TITLE>wel

  • 正则表达式教程之位置匹配详解

    本文实例讲述了正则表达式教程之位置匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 如果想匹配一段文本中的某个单词(暂不考虑多行模式,将在后面介绍),我们可能会像下面这样: 文本:Yesterday is history, tomorrow is a mystery, but today i

  • 正则表达式教程之子表达式用法分析

    本文实例讲述了正则表达式教程之子表达式用法.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 首先来看一个例子,有的短语如Windows 2000虽然是多个单词组成,但其实是一个整体,HTML页面中可以使用非换行空格( 即non-breaking space)让它在浏览器中显示在一行上,现在来匹配

  • 正则表达式教程之元字符的使用详解

    本文实例讲述了正则表达式教程之元字符的使用.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.对特殊字符进行转义 元字符是一些在正则表达式里有着特殊含义的字符.因为元字符在正则表达式里有着特殊的含义,所以这些字符就无法用来代表它们本身.在元字符前面加上一个反斜杠就可以对它进行转义,这样得到的转义序列将匹配那

  • 一看就懂的正则表达式教程

    目录 案例引入 正则表达式 命名规范 结构组成 用途场景 Java中的正则校验 正则元字符 正则:普通字符 正则:\d 正则:\D 正则:\w 正则:\W 正则:\s 正则:[^abc] 正则:[a-z] 正则:[^a-z] 正则:\num 正则:? 正则:+ 正则:{n} 正则:{n,m} 正则:* 总结 案例引入 在讲正则表达式前,我们不妨先从一个场景来逐渐引入. 你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图).

随机推荐