[转载]ruby 正则笔记

Posted

Ruby的正则表达式以"//"作为构造方法。表达式返回一个RegExp的对象。

一、字符规则

1. /a/匹配字符a。     
2.  /[\d]/代表任意数字
3.  /[\w]/代表任意字母,数字或者_
4.  /[\s]/代表空白字符,包括空格,TAB和换行。    
5.  /\?/匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.    
6.  /[ab]c/匹配ac和bc,[]之间代表范围。例如:/[a-z]/ , /[a-zA-Z0-9]/。    
7.  /[^a-zA-Z0-9]/匹配不在该范围内的字符串。     
8.  /[\D]/,/[\W]/,/[\S]/均为上述的否定情况。 
9.  reA|reB 匹配 reA或者reB
10.  .(点符号)匹配任意字符,例如/a./匹配ab和ac。   

二、数量规则

1.  /[A-Z](\d){4}/匹配首位是大写字母,后面4个是数字的字符串,例如:A1234。
/([A-Z]\d){4}/  匹配:4组为首位是大写字母,第二位为数字的组合,例如:A1B2C3D4
2.  ?(问号)代表0或1个字符。/Mrs?\.?/匹配"Mr","Mrs","Mr.","Mrs."。
解析:/ M r s? \.? / M后面是字符r, 后面是0或1个字符s, 在后面是0或1个字符"."  
3.  *(星号)代表0或多个字符。/Hello*/匹配"Hello","HelloJack"。 
4.  +(加号)代表1或多个字符。/a+c/匹配:"abc","abbdrec"等等。 
5.  re{n}  匹配正好n个re  /d{3}/匹配3个数字。 
6.  re{m,n}  匹配至少m个最多n个re    /d{1,10}/匹配1-10个数字。 
7.  re{m,}  匹配至少m个re   /d{3,}/匹配3个数字以上。 

三、正则表达式操作

String和RegExp均支持=~和match 2个查询匹配方法

1. =~  返回匹配的第一个字符串位置,不匹配返回空nil
puts "12345678901"=~/1/
输出:0
puts "123456789045"=~/45/
输出:3

2.match返回一个MatchData对象。如果不匹配返回nil。
a=/abc/.match("abc cba adbdc abc")
puts a[0]
输出:abc
b=/aaa/.match("abc cba adbdc abc")
puts b[0]
报错:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

3.[0]返回匹配主表达式的字符串,用()包括可显示子类
b=/[A-Za-z]+,[A-Za-z]+,Mrs?\./.match("One,Fei,Mrs.,hello")
puts b[0]
输出:One,Fei,Mrs.

c=/([A-Za-z]+),([A-Za-z]+),Mrs?\./.match("Two,Fei,Mrs.,hello")
puts c[0]
puts c[1]
puts c[2]
输出:
Two,Fei,Mrs.
Two
Fei

d=/(([A-Za-z]+),([A-Za-z]+)),Mrs?\./.match("Three,Fei,Mrs.,hello")
puts d[0]
puts d[1]
puts d[2]
puts d[3]
输出:
Three,Fei,Mrs.
Three,Fei
Three
Fei

4.Ruby也自动的为我们填写了一些全局变量,它们以数字做名:

$1,$2,等等,$1包含的是正则表达式中从左侧开始的第一对小括号内的子模式所匹配的字符串
我们看出匹配时,是从外到内,从左到右的顺序
string="PhoneNum:(021) 888-1234;Tele:13913913696;"
phone=/\((\d{3})\)\s+(\d{3})-(\d{4})/
m=phone.match(string)
print "匹配前内容:"
puts m.pre_match
print "匹配后内容:"
puts m.post_match
print "第二个匹配开始的字符"
puts m.begin(2)
print "第三个匹配开始的字符"
puts m.begin(3)
输出:
匹配前内容:PhoneNum:
匹配后内容:;Tele:13913913696;
第二个匹配开始的字符15
第三个匹配开始的字符19

四、高级操作

1.贪婪量词和不贪婪量词

量词*(零个或多个)和+(一个或多个)是贪婪的,它们会匹配尽可能多的字符,我们可以在*和+后面加一个?,使它成为非贪婪量词
下面代码是: 1个或多个字符后接一个感叹号。

test="abcdefg!!!"
match=/.+!/.match(test)
puts match[0]
limitmatch=/.+?!/.match(test)
puts limitmatch[0]
输出:
abcdefg!!!
abcdefg!

2.锚是指必须满足一定的条件,才能继续匹配

^     行首
$     行尾
\A   字符串的开始
\z    字符串的结尾
\Z    字符串的结尾(不包括最后的换行符)
\b    单词边界
\B    非单词边界

test="  # Ruby comment line"
a=/^\s*#/.match(test)
puts a[0]
a=/^\s*#(.+)/.match(test)
puts a[1]
b=/\ABetter man/.match("Better man is fei")
puts b[0]
c=/\b\w+\b/.match("!!!fei**")
puts c[0]

输出:
  #
 Ruby comment line
Better man
fei

五、正则表达式实例 1.邮箱

/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
解析:^和+$ 为了判定字符串前后的空白字符

2.小数

^[0-9]+(.[0-9]{2})$  ---2位小数

3.正整数

/^\+?[1-9][0-9]*$/

4.验证长度为3的字符:

/^.{3}$/

5.验证是否含有

^%&',;=?$\" 等字符:/[^%&',;=?$\x22]+/

6.验证身份证号(15位或18位数字)

^\d{15}|\d{}18$

7..rb结尾的文件

/\w.*(?=\.rb+$)/

ref:

Ruby正则表达式编辑器 rubular.com

http://www.iteye.com/topic/60620

http://www.iteye.com/topic/60620


此文章 短链接: http://dlj.bz/drU6qb