`
凌川__
  • 浏览: 83792 次
  • 性别: 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    
 

 

分享到:
评论

相关推荐

    正则表达式必知必会pdf

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

    无私分享(C#高级编程第6版):第08章字符串和正则表达式[收集].pdf

    在C#高级编程的第6版中,第08章深入探讨了字符串和正则表达式这两个关键概念。 **8.1 System.String类** System.String类是.NET框架中处理字符串的基础,它代表不可变的字符序列。这意味着一旦创建了字符串对象,...

    第8章JavaIO第8章JavaIO第8章JavaIO第8章JavaIO第8章JavaIO第8章JavaIO

    8.3 正则表达式与IO 正则表达式在Java中通过Pattern和Matcher类实现,可以与I/O结合使用,用于在读取的文本中进行模式匹配和查找。 8.4 新IO(NIO) Java的新I/O API(非阻塞I/O),引入于Java 1.4,提供了Channel...

    Flexible Renamerv 8.3

    "Flexible Renamer 8.3"就是这样一款专为此目的设计的专业软件,它以其强大的正则表达式支持和简洁的操作界面赢得了用户的广泛好评。 Flexible Renamer 8.3 的核心优势在于其对正则表达式的支持。正则表达式...

    国防科技大学编译原理答案

    《国防科技大学编译原理答案》课程的第三章主要讲解了词法分析,其中涉及的核心知识点是确定有限自动机(DFA)的构造及其在解决正则表达式问题上的应用。以下将详细介绍这部分内容。 首先,习题7要求构造正规式的...

    Flexible Renamer v8.3

    这款强大的文件和文件夹批量改名软件,以其强大的通配符和正则表达式支持,为用户提供了灵活、高效的解决方案。 Flexible Renamer v8.3 是一款专为满足用户批量改名需求而设计的应用软件。它不仅界面简洁,操作...

    JavaScript核心及实践

    - **String中的正则表达式**: JavaScript的String对象中内置了许多使用正则表达式的方法。 #### 闭包 - **7.1闭包的特性**: 闭包是一个函数和声明该函数的词法环境的组合。 - **7.2闭包的用途**: 闭包可以用于实现...

    SecureCRT 8配色配置文件xml

    SecureCRT 8配色的配置文件,文件格式为xml,可以直接导入,方便使用。预览见:https://blog.csdn.net/hgcpkclwcx/article/details/78929737

    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 从正则表达式到...

Global site tag (gtag.js) - Google Analytics