每天一条Ruby小道之正则表达式

每天一条Ruby小道之正则表达式

孟岩的[url=http://blog.csdn.net/myan/archive/2007/07/23/1703404.aspx]《精通正则表达式》书评[/url]里讲到:
“正则表达式具有伟大技术发明的一切特点,它简单,优美,功能强大,妙用无穷”

其实很多语言都内置正则表达式支持,普遍的跟几乎所有手机都支持摄像头似的

好了,就让我们来领略Ruby下正则表达式的威力吧

1,正则表达式的表达形式
1)使用//分隔,如/Ruby/,/^abc/
2)使用%r加分隔符,如%r(xyz$),%r{[0-9]*},%r$[Rr]uby$

2,修饰符
1)/i忽略大小写
2)/m让“.”可以匹配换号符“\n”
3)/x允许正则表达式里有空格和注释
4)/o使得任何在正则表达式字面量中使用#{...}替代时只处理一次,而默认是每次生成Regexp对象时都处理#{...}替代的
[code]
a = "abc"
regexp = /[0-9]#{a}[a-z]/
[/code]

3,正则表达式里使用的常用符号
1)^
一行的开始
2)$
一行的结束
3).
任何字符(除了换行)
4)\w
词语(数字,字母或下划线)
5)\W
非词语
6)\s
空格字符(空格,tab,换行)
7)\S
非空格字符
8)\d
数字(等同于[0-9])
9)\D
非数字
10)\A
字符串的开始
11)\Z
字符串的结束或换行
12)\z
字符串的结束
13)\b
词语分界线(仅仅在[]外面时)
14)\B
非词语分界线
15)\b
退格(仅仅在[]里面时)
16)[]
集合中的任何单字符
17)*
0个或多个前面的表达式
18)*?
0个或多个前面的表达式(non-greedy)
19)+
1个或多个前面的表达式
20)+?
1个或多个前面的表达式(non-greedy)
21){m,n}
m到n个前面的表达式实例
22){m,n}?
m到n个前面的表达式实例(non-greedy)
23)?
0个或1个前面的表达式
24)|
二选一
25)(?= )
匹配后面的表达式
26)(?! )
不匹配后面的表达式
27)()
分组子正则表达式
28)(?> )
嵌入子正则表达式
29)(?: )
不捕获组
30)(?imx)和(?-imx)
打开或关闭i,m,x选项
31)(?imx:expr)或(?-imx:expr)
为表达式expr打开或关闭i,m,x选项
32)(?# )
注释

4,编译正则表达式
我们可以使用Regexp.compile方法来“编译”正则表达式,实际上它是Regexp.new方法的别名。
compile方法的第一个参数可以是字符串或正则表达式,正则表达式的选项会在编译时丢掉。
compile方法的第二个参数为常量Regexp::EXTENDED,Regexp::IGNORECASE,Regexp::MULTILINE之一。
compile方法的第三个参数指示语言,它允许多字节字符支持。
[code]
expr1 = Regexp.compile("#foo.*") # => /^foo.*/
expr2 = Regexp.compile(/bar$/i) # => /bar/ (i被忽略)
expr3 = Regexp.compile("^foo", Regexp::MULTILINE || Regexp::IGNORECASE)
expr4 = Regexp.compile(/bar/, Regexp::IGNORECASE, "u")
[/code]
第三个参数:
"N"或"n"表示None
"E"或"e"表示EUC
"S"或"s"表示Shift-JIS
"U"或"u"表示UTF-8

一般情况下使用正则表达式字面量即可: expr = /^foo.*$/i

5,[]详解
匹配[]内字符列表中的一个单字符:
[code]
/[aeiou]/ # 匹配a,e,i,o,u中的一个字符
[/code]
在[]内,\n仍然有意义,但.和?没有特殊的意义了:
[code]
/[.\n?]/ # 匹配.,换行,?中的一个字符
[/code]
如果^为[]里第一个字符,则否定后面所有的字符列表:
[code]
/[^aeiou]/ # 任何除了a,e,i,o,u的字符
[/code]
-用来表示字符范围:
[code]
/[a-mA-M]/ # 任何a到m或A到M的字符
/[^a-mA-M]/ # 任何除了a到m和A到M的字符
[/code]
如果-出现在[]中第一个或最后一个字符,或^、[用在中间,则它们失去了上面所说的意义,但]需要escape:
[code]
/[-^[\]]/ # 匹配-,^,[,]中的一个字符
[/code]
命名字符:
[code]
/[[:digit:]]/ # 匹配数字
/[[:print:]]/ # 匹配可打印字符
/[[:alpha:]]/ # 匹配字母
/[[:^alpha:]]/ # 匹配非字母
[/code]

6,使用/x来让正则表达式跨行和加注释
当正则表达式很复杂时,使用/x来跨行和加注释可以获得更好的可读性:
[code]
regex = / ^ # Beginning of string
((No\.?)\s+)? # Optional: No[.]
\d+ \s+ # Digits and spacing
((\W|[.'-])+ # Street name... may be
\s* # multiple words.
)+
(,\s* # Optional: Comma etc.
(Apt\.?|Suite}\#) # Apt[.], Suite, #
\s+ # Spacing
(\d+|[A-Z]) # Numbers or single letter
)?
$ # End of string
/x
[/code]

7,Ruby的新正则表达式引擎Oniguruma
更好的支持国际化,并且添加了许多强大的特性,license也限制更少,but还没有完全集成到Ruby标准发布版本里

正则表达式是上世界90年代随着Perl走红而走红的,如今它已经成为现代编程语言不可或缺的一部分
合理的使用正则表达式,会让我们事半功倍
本章其他小节讲述了一些Regexp类的api,这里就不介绍了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值