- 浏览: 84037 次
- 性别:
最近访客 更多访客>>
最新评论
-
Bernice_liu:
谢谢分享,受益匪浅,适合我——初学者
Ruby语言中文教程all in one -
何枫abc:
怎么感觉Ruby有点像C!!!
3.5 标识名和变量的作用域 3.6 类库 3.7 数据类型 -
何枫abc:
谢谢了!!!你写的很好,现在我正在学Ruby!!!
第二章 运行环境 -
yangzhihuan:
正想知道ruby是怎么样生成像javadoc那样的文档,多谢了 ...
3.1 注释与分行 -
whisper:
从lambda演算的角度说我们并不关心一个东西到底是什么,而只 ...
变量一定要有类型吗(一)
一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言联系如此紧密,总让人感觉绕不开它。所以匆匆结束字符串的介绍,边学边说正则表达式。
正则表达式之强大、复杂,由来已久。自从1956年提出了“正则集代数”,正则表达式就逐渐被广泛地应用于操作系统,编程语言,算法设计,人工智能……
现在,除了Perl这样支持强大正则表达式功能的语言之外,Java,JavaScript, C# 等语言都纷纷支持正则表达式,只不过支持的程度不同。而Ruby正是一种强烈而灵活地支持正则表达式的语言。
下面,我努力尝试尽可能简单地描述Ruby中的正则表达式。
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串;将匹配的子串做替换;或者从某个串中取出符合某个条件的子串;等等。
Ruby中,可以使用构造器显式地创建一个正则表达式,也可以使用字面值形式 /正则模式/ 来创建一个正则表达式。
- #E8.3-1.rb
- str="Hello,kaichuan,Welcome!"
- puts str =~ /kaichuan/ # => 6
- puts str =~ /a/ # => 7
- puts str =~ /ABC/ # => nil
我在字符串str中找我的名字 kaichuan。找到了,在字符串str的第6个字符处。和数组一样,字符串的起始索引位置是0。
在字符串str中找小写字母a,也找到了,第一个小写字母a在字符串str的第7个字符处;在字符串str中找大写字母ABC,没有找到。
匹配一个正则表达式,用“=~” ,不能用“==”。 “=~”用来比较是否符合一个正则表达式,返回模式在字符串中被匹配到的位置,否则返回nil。
不匹配一个正则表达式,用“!~” ,不能用“!=”。 “!~”用来断言不符合一个正则表达式,返回 true,flase。
- #E8.3-2.rb
- str="Hello,kaichuan,Welcome!"
- puts str !~ /kaichuan/ # => false
- puts str !~ /a/ # => false
- 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] 表示在a 到 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,
- #E8.3-3.rb
- strdoc=《<doc_eof span=""></doc_eof> DOC_EOF
- This is windows2000 or windows98 system.
- Windows system is BEST?
- Windows2000 running in 12-31-2006,……
- DOC_EOF
- re = /[w|W]indows(?:98|2000) /
- strdoc.gsub!(re, "Windows XP ")
- re = /[1-9][0-9]\-[1-9][0-9]\-\d\d\d\d/
- time = Time.now.strftime("%m-%d-%Y")
- strdoc.gsub!(re, time)
- 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
发表评论
-
8.4 迭代器、代码块、闭包
2007-02-13 06:25 1771先看一句代码: ruby 代码 (1..9). ... -
8.2 再说字符串
2007-02-13 06:07 1361一. 生成一个字符串 字 ... -
8.1 再说数组
2007-02-13 06:03 1488一. 建立一个数组 ruby 代码 #E8.1- ... -
7.4 require 和 load
2007-02-13 05:59 1365程序 E7.3-1.rb中先写了Me模块,然后include ... -
7.3 糅和(Mix-in) 与多重继承
2007-02-13 05:55 1812糅和,也译作混合插入,也许就称作 Mix-in 比较合适。 现 ... -
7.1 模块 7.2 命名空间
2007-02-13 05:50 22477.1 模块 我们常常把许 ... -
6.5 访问控制
2007-02-13 05:43 1200在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象 ... -
6.4 单例方法
2007-02-13 05:16 1043同一份设计蓝图(类),不同的实例对象,可以表现出不同的行为特征 ... -
6.3 实例变量、类变量、类方法
2007-02-13 05:28 2277学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例 ... -
6.2 增强父类方法
2007-02-13 04:39 1052如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键 ... -
6.1 重载?重写
2007-02-13 04:11 1932在Java 中,重载(overload)和重写(overrid ... -
5.5 一些编码建议
2007-02-13 03:37 1161这里不是 Ruby语言的编 ... -
5.4 蓝图可以改变吗? ——动态语言
2007-02-13 03:28 780Ruby 是动态语言,你可以改变 Ruby 程序的结构,功能, ... -
5.3 详解变量—— 动态类型
2007-02-13 03:22 1200变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量 ... -
5.1 为什么是Ruby? 5.2 Ruby会长久么?
2007-02-13 03:16 10315.1 为什么是Ruby? 现 ... -
4.5 多态
2007-02-13 03:07 801不同的子类继承一个父 ... -
4.4 继承
2007-02-13 03:04 839如果我们要写一个学生 ... -
4.3 封装
2007-02-13 02:53 935让我们来定义一个类,类名是Person,类名首字母要大写;属性 ... -
4.1 两种思维方式 4.2 对象
2007-02-13 02:47 9394.1 两种思维方式 人们 ... -
3.11 一个综合小练习
2007-02-13 02:05 1033还是求50以内的素数,尽可能地用到本章更多的语法,看程序 E3 ...
相关推荐
目录 · · · · · ·第1章 正则表达式入门1.1 正则表达式的用途1.2 如何使用正则表达式1.3 什么是正则表达式1.4 使用正则表达式1.5 在继续学习之前1.6 小结第2章 匹配单个字符2.1 匹配纯文本2.2 匹配任意字符2.3 ...
在C#高级编程的第6版中,第08章深入探讨了字符串和正则表达式这两个关键概念。 **8.1 System.String类** System.String类是.NET框架中处理字符串的基础,它代表不可变的字符序列。这意味着一旦创建了字符串对象,...
8.3 正则表达式与IO 正则表达式在Java中通过Pattern和Matcher类实现,可以与I/O结合使用,用于在读取的文本中进行模式匹配和查找。 8.4 新IO(NIO) Java的新I/O API(非阻塞I/O),引入于Java 1.4,提供了Channel...
"Flexible Renamer 8.3"就是这样一款专为此目的设计的专业软件,它以其强大的正则表达式支持和简洁的操作界面赢得了用户的广泛好评。 Flexible Renamer 8.3 的核心优势在于其对正则表达式的支持。正则表达式...
《国防科技大学编译原理答案》课程的第三章主要讲解了词法分析,其中涉及的核心知识点是确定有限自动机(DFA)的构造及其在解决正则表达式问题上的应用。以下将详细介绍这部分内容。 首先,习题7要求构造正规式的...
这款强大的文件和文件夹批量改名软件,以其强大的通配符和正则表达式支持,为用户提供了灵活、高效的解决方案。 Flexible Renamer v8.3 是一款专为满足用户批量改名需求而设计的应用软件。它不仅界面简洁,操作...
- **String中的正则表达式**: JavaScript的String对象中内置了许多使用正则表达式的方法。 #### 闭包 - **7.1闭包的特性**: 闭包是一个函数和声明该函数的词法环境的组合。 - **7.2闭包的用途**: 闭包可以用于实现...
SecureCRT 8配色的配置文件,文件格式为xml,可以直接导入,方便使用。预览见:https://blog.csdn.net/hgcpkclwcx/article/details/78929737
不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和LZ77等数据压缩技术。 随附光盘中有作者所开发的一个相当成功的自由软件库EZDSL,另外还有可运行于各版本Delphi上和Kylix上的源...
不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和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 从正则表达式到...
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 从正则...
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 从正则表达式到...