首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

正则表达式——极速入门

Posted on 2010-01-14 17:28  停留的风  阅读(3107)  评论(10编辑  收藏  举报

正则表达式:

正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。正则以其简单、实用、快速深得广大编程人员的热爱。

编写正则一些思维:

1、首先,确定规则。你需要匹配一个什么样字符串,它有哪几部分构成,它有哪些特征。

2、提出最小单位。有的时候,一些匹配规则是重复的,我们可以试着找到共同点,规划为一条规则。

3、根据其规则、最小单位,逐一写出正则

4、将这些单位正则组合统一,构成你想要的完整正则。

 

在这里我们就需要了解一些基本的标记和用法,任何的规则都是用基本标记组合而成的。而正则的标记也很简单,大家不妨了解一下。

 

正则表达式中常用的标记

 

1 正则表达式中常用的标记
2  ^ | 行或字符串开头
3 $ | 行或字符串末尾
4  . | 除换行符外的字符
5  \w | 单词字符 (数字、字母或下划线)
6  \W | 非单词字符
7  \d | 数字(等同于【0-9】)
8  \D | 非空白字符
9
10  \A | 字符串开头
11  \Z | 字符串末尾或最后的换行符钱
12  \z | 字符串末尾
13
14  \s | 空白字符
15  \S | 非空白字符
16
17  \b | 单词边界(【】外)
18  \B | 非单词边界
19  \b | 退格(在【】内)
20 [] | 集合中的任何一个字符,中间使用连字符,则表示范围,如:[0-9],[a-z]
21  ? | 0或1个之前的表达式
22  | |
23 ( ) | 子表达式编组
24
25  * | 零或多个之前的表达式
26  *? | 零或多个之前的表达式(非贪婪)
27  + | 1个或多个之前的表达式
28  +? | 1个或多个之前的表达式(非贪婪)
29 {m,n}| m-n个之前的表达式
30 {m,n}? | m-n个之前的表达式(非贪婪的)
31
32
33 还有{?=} {?!} (?>) (?#) (?imx-imx)等

 

最基本的实例:

1 #匹配整个字符串
2 puts /ruby/ =~ "ruby" # 0
3 puts /ruby/ =~ "Ruby" # nil
4
5 #匹配行或字符串开头与结尾
6 str = "abcdef"
7 puts str
8 puts /^abc/ =~ str # 0
9 puts /def$/ =~ str # 3
10
11 str = "abc\ndef\n"
12 puts /^abc/ =~ str # 0
13 puts /def$/ =~ str # 4
14 puts /abc/ =~ str # 0
15 puts /def/ =~ str # 4
16
17 #匹配字符串本身的开头和结尾
18 str = "abc\ndef\n"
19 puts /\Aabc/ =~ str # 0
20 puts /def\Z/ =~ str # 4
21 puts /def\z/ =~ str # nil
22
23 #匹配单词字符
24 puts "匹配单词字符"
25 pattern = /\w/
26 puts pattern =~ "abc" # 0
27 puts pattern =~ "." # nil
28
29 #匹配整数
30 # \d 数字
31 # \D 非数字
32 puts "匹配数字"
33 puts /\d/ =~ "122" #0
34 puts /\D/ =~ "122" #nil
35 puts /\D/ =~ "abc" #0
36
37
38 #边界
39 str = "This is your friend!"
40 puts str
41 puts str.gsub(/\b/,"|") # |This| |is| |your| |friend|!
42 puts str.gsub(/\B/,"-") # T-h-i-s i-s y-o-u-r f-r-i-e-n-d!-
43  

 

限定符实例

 

1 puts "限定符"
2 puts "限定符:*"
3 puts /(abc)*/ =~ "a" # 0
4  puts /(abc)*/ =~ "abc" # 0
5  
6
7 puts "限定符:+"
8 puts /(abc)+/ =~ "a" # nil
9  puts /(abc)+/ =~ "abc" # 0
10  
11 puts "限定符:?"
12 puts /(abc)?/ =~ "c" # 0
13  puts /(abc)?/ =~ "abc" # 0
14
15
16 puts "限定符: {n}"
17 puts /(abc){2}/ =~ "abc" # nil
18 puts /(abc){2}/ =~ "abcabc" # 0
19
20 puts "限定符: {n,}"
21 puts /(abc){2,}/ =~ "abc" # nil
22 puts /(abc){2,}/ =~ "abcabc" # 0
23
24 puts "限定符: {n,m}"
25 puts /(abc){2,3}/ =~ "abc" # nil
26 puts /(abc){2,3}/ =~ "abcabcabc" # 0
27
28 puts "限定符: *?"
29 puts /(abc)*?/ =~ "a" # 0
30 puts /(abc)*?/ =~ "abcabc" # 0
31
32 puts "限定符: +?"
33 puts /(abc)+?/ =~ "a" # nil
34 puts /(abc)+?/ =~ "abcabc" # 0
35
36 puts "限定符: ??"
37 puts /(abc)??/ =~ "a" # 0
38 puts /(abc)??/ =~ "abcabc" # 0
39
40
41 #匹配, {1} {3}
42 # {3}能匹配,那{1}肯定能匹配,反过来不成立
43 # 匹配范围:{1} > {3}

 

常用实例:

 

1 puts "例子"
2 #匹配电话号码:
3 #一般中国的电话号码为7-8位,区号3-4位整数,区号第一位是0,中间用分隔符‘-’
4 #注意首尾限制符
5 pattern = /^0\d{2,3}-\d{7,8}$/
6 puts pattern =~ "010-82809999" # 0
7 puts pattern =~ "00010-82809999" # nil
8
9 #匹配手机号码
10 # 1开头,第二位为3、5、8,11位数字
11 pattern = /^1[3,5,8]\d{9}$/
12 puts pattern =~ "15810990001" #0
13
14 #身份证号码
15 pattern = /\d{18}|d{15}/
16
17 #匹配IP
18 #四组不大于255的整数组成,中间用'.'分隔
19 puts "IP"
20 num = /^\d|[01]?\d{1,2}|2[0-4]\d|25[0-5]/
21 pattern = /^(#{num}\.){3}#{num}$/
22 #一个整体:pattern = /^(^\d|[01]?\d{1,2}|2[0-4]\d|25[0-5]\.){3}^\d|[01]?\d{1,2}|2[0-4]\d|25[0-5]$/
23 puts pattern =~ "127.0.0.1" # 0
24 puts pattern =~ "254.255.255.255"
25
26 #匹配电子邮箱
27 pattern = /^\w+@\w+.\w+$/ #这个没有 ‘-’
28 pattern = /^[\w-]+@[\w-]+.[\w-]+$/
29 puts pattern =~ "abc@gmail.com" #0
30
31 # 匹配url
32 # http://www.google.cn
33 pattern = /(http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(((\/[\~]*|\\[\~]*)
34 (\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*/
35
36 puts pattern =~ "http://www.google.cn?uid=123" #0

 

其它

 

贪婪的意义
1 puts "贪婪的"
2 #贪婪的,就是匹配尽可能长的字符串
3 # '.' 含义:除换行符外的字符
4 str = "where the sea meets the moon-blanch'd land"
5 puts str
6 match = /.*the/.match(str)
7 puts match[0] # where the sea meets the,*是贪婪的。如果不想贪婪就在其后加+ '?'
8 #*?非贪婪
9 match = /.*?the/.match(str)
10 puts match[0] # where the
11
12 str.insert(0,"Hello \n")
13 match = /.*?the/.match(str)
14 puts match[0] #where the

 

正负预查
1 #正负预查
2 puts "正负预查"
3 s1 = "New World Dictionary"
4 s2 = "New World Symphony"
5 s3 = "New World Order"
6
7 reg = /New World (?=Dictionary|Symphony)/
8 m1 = reg.match(s1)
9 puts m1.to_a[0] # "New World"
10 m2 = reg.match(s2)
11 puts m2.to_a[0] # "New World"
12 puts reg.match(s3) # nil
13
14 puts "负预查"
15
16 reg = /New World (?!Symphony)/ # "New World "后面没有“Symphony”
17 puts reg.match(s1).to_a[0] # "New World"
18 puts reg.match(s2).to_a[0] # nil
19 puts reg.match(s3).to_a[0] # "New World"