`
凌川__
  • 浏览: 82291 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

8.3 正则表达式

阅读更多

一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言联系如此紧密,总让人感觉绕不开它。所以匆匆结束字符串的介绍,边学边说正则表达式。
正则表达式之强大、复杂,由来已久。自从1956年提出了“正则集代数”,正则表达式就逐渐被广泛地应用于操作系统,编程语言,算法设计,人工智能……
现在,除了Perl这样支持强大正则表达式功能的语言之外,Java,JavaScript, C# 等语言都纷纷支持正则表达式,只不过支持的程度不同。而Ruby正是一种强烈而灵活地支持正则表达式的语言。
下面,我努力尝试尽可能简单地描述Ruby中的正则表达式。
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串;将匹配的子串做替换;或者从某个串中取出符合某个条件的子串;等等。
Ruby中,可以使用构造器显式地创建一个正则表达式,也可以使用字面值形式 /正则模式/ 来创建一个正则表达式。

ruby 代码
  1. #E8.3-1.rb   
  2.   
  3. str="Hello,kaichuan,Welcome!"  
  4.   
  5. puts  str =~  /kaichuan/            # => 6       
  6. puts  str =~  /a/                  # => 7    
  7. puts  str =~  /ABC/               # => nil    



我在字符串str中找我的名字 kaichuan。找到了,在字符串str的第6个字符处。和数组一样,字符串的起始索引位置是0。
在字符串str中找小写字母a,也找到了,第一个小写字母a在字符串str的第7个字符处;在字符串str中找大写字母ABC,没有找到。
匹配一个正则表达式,用“=~” ,不能用“==”。 “=~”用来比较是否符合一个正则表达式,返回模式在字符串中被匹配到的位置,否则返回nil。
不匹配一个正则表达式,用“!~” ,不能用“!=”。 “!~”用来断言不符合一个正则表达式,返回 true,flase。

ruby 代码
  1. #E8.3-2.rb   
  2.   
  3. str="Hello,kaichuan,Welcome!"  
  4.   
  5. puts  str !~ /kaichuan/     # =>  false       
  6. puts  str !~ /a/            # =>  false      
  7. puts  str !~ /ABC/         # =>  true  



假设现在有一篇很短的文章如下:
This is windows2000 or windows98 system.
Windows system is BEST?
Windows2000 running in 12-31-2006,……
我们需要将文章中所有的windows2000 或者 windows98 换成 Windows XP,不论单词开头大小写,但是不带数字的windows不换;并且要把2006年12月31日改成当前时间,如何使用正则表达式来替换呢?
给出例程 E8.3-3.rb 之前,先学习一些烦琐的东西。

 

一些字符或字符组合在正则表达式中有特殊的意义,分别如下:
特别字符

特别字符
描述
( )
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( \)
[] 
范围描述符 (比如,[a - z] 表示在 z 范围内的一个字母)要匹配 [,请使用 \[
{}
标记限定符表达式。要匹配 {,请使用 \{
\
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
例如, 'n' 匹配字符 'n''\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("
|
指明两项之间的一个选择。要匹配 |,请使用 \|
.
匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \

 
非打印字符

非打印字符
描述
\f
匹配一个换页符。等价于 \x0c
\n
匹配一个换行符。等价于 \x0a
\r
匹配一个回车符。等价于 \x0d
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\t
匹配一个制表符。等价于 \x09
\w
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'字母或数字;相当于 [0-9A-Za-z]
\W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'非字母,数字
\d
匹配一个数字字符。等价于 [0-9] [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

定位符

  用来描述字符串或单词的边界, ^ $ 分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。

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

 
各种操作符的运算优先级

  相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:

优先级
操作符
描述
\
转义符
 
(), []
圆括号和方括号
 
*, +, ?, {n}, {n,}, {n,m}
限定符
 
^, $,
位置和顺序
|
操作

正则表达式强大,但是枯燥。有一个办法,就是等你需要用的时候再来学习。

下面解释例程 E8.3-3.rb,

ruby 代码
  1. #E8.3-3.rb   
  2.   
  3. strdoc=《<doc_eof span=""></doc_eof> DOC_EOF   
  4. This is windows2000 or windows98 system.   
  5. Windows system is BEST?   
  6. Windows2000 running in 12-31-2006,……   
  7. DOC_EOF   
  8.   
  9. re = /[w|W]indows(?:98|2000) /   
  10. strdoc.gsub!(re, "Windows XP ")    
  11. re = /[1-9][0-9]\-[1-9][0-9]\-\d\d\d\d/   
  12. time = Time.now.strftime("%m-%d-%Y")   
  13. strdoc.gsub!(re, time)     
  14. puts strdoc  

运行结果:
>ruby E8.3-3.rb
This is Windows XP or Windows XP system.
Windows system is BEST?
Windows XP running in 02-06-2007,……
>Exit code: 0


strdoc.gsub!(re, "Windows XP "),是把字符串strdoc里所有匹配正则模式re的子串替换为 "Windows XP "。 gsub!是替换所有子串。
strdoc.gsub!(re, time),是把字符串strdoc里所有匹配正则模式re的子串替换为字符串time。
time = Time.now.strftime("%m-%d-%Y"),取出系统当前时间,并且格式化成( 月-日-年 )的形式,生成一个字符串time。


完整阅读,请看我写的 Ruby语言中文教程all in one    
 

 

分享到:
评论

相关推荐

    正则表达式经典实例

    中文名: 正则表达式经典实例 原名: Regular Expression Cookbook 作者: (美)高瓦特斯(Goyvaerts,J.) (美)利维森(Levithan,S.)译者: 郭耀 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: ...

    正则表达式经典实例.pdf

    中文名: 正则表达式经典实例 原名: Regular Expression Cookbook 作者: (美)高瓦特斯(Goyvaerts,J.) (美)利维森(Levithan,S.)译者: 郭耀 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115228321发行...

    正则表达式必知必会pdf

    目录 · · · · · ·第1章 正则表达式入门1.1 正则表达式的用途1.2 如何使用正则表达式1.3 什么是正则表达式1.4 使用正则表达式1.5 在继续学习之前1.6 小结第2章 匹配单个字符2.1 匹配纯文本2.2 匹配任意字符2.3 ...

    Flexible Renamer v8.3

    Flexible Renamer是一款很好用的文件和文件夹批量改名软件,支持通配符及正则表达式。

    Flexible Renamerv 8.3

    文件改名工具,支持正则表达式,功能相当强悍,使用非常简单,无需注册。

    Delphi算法与数据结构 源码(上)

    不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和LZ77等数据压缩技术。 随附光盘中有作者所开发的一个相当成功的自由软件库EZDSL,另外还有可运行于各版本Delphi上和Kylix上的源...

    Delphi算法与数据结构 源码(下)

    不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和LZ77等数据压缩技术。 随附光盘中有作者所开发的一个相当成功的自由软件库EZDSL,另外还有可运行于各版本Delphi上和Kylix上的源...

    《编译原理及实践》电子书下载

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    《编译原理》 清华 第二版

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    C#编译原理 ZIP 压缩文件

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理中文版

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理--龙书

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则...

    编译原理(china-pub) 高清

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理及实践

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理及实践 附有目录

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    JavaScript王者归来part.1 总数2

     10.4.1 RegExp对象——利用正则表达式实现全文检索   10.4.2 RegExp的实例属性   10.5 强大的正则表达式   10.5.1 分析正则表达式的局部   10.5.2 一个例子--强大的在线编辑器   10.5.3 构造新的文法--...

    编译原理及实现

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理及实践(需要了解编译原理的可以看看)

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    PHP入门到精通

    正则表达式(教学录像:28分34秒) 6.1什么是正则表达式 6.2正则表达式语法规则 6.3POSIX扩展正则表达式函数 6.4PCRE兼容正则表达式函数 PHP数组(教学录像:56分29秒) 7.1了解数组 7.2声明数组 7.3数组的类型 7.4...

Global site tag (gtag.js) - Google Analytics