正则表达式:
正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。正则以其简单、实用、快速深得广大编程人员的热爱。
正则表达式中常用的标记
01 ^ | 行或字符串开头
02 $ | 行或字符串末尾
03 . | 除换行符外的字符
04 \w | 单词字符 (数字、字母或下划线)
05 \W | 非单词字符
06 \d | 数字(等同于【0-9】)
07 \D | 非空白字符
08
09 \A | 字符串开头
10 \Z | 字符串末尾或最后的换行符钱
11 \z | 字符串末尾
12
13 \s | 空白字符
14 \S | 非空白字符
15
16 \b | 单词边界(【】外)
17 \B | 非单词边界
18 \b | 退格(在【】内)
19 [] | 集合中的任何一个字符,中间使用连字符,则表示范围,如:[0-9],[a-z]
20 ? | 0或1个之前的表达式
21 | | 或
22 ( ) | 子表达式编组
23
24 * | 零或多个之前的表达式
25 *? | 零或多个之前的表达式(非贪婪)
26 + | 1个或多个之前的表达式
27 +? | 1个或多个之前的表达式(非贪婪)
28 {m,n}| m-n个之前的表达式
29 {m,n}? | m-n个之前的表达式(非贪婪的)
30
31 还有{?=} {?!} (?>) (?#) (?imx-imx)等
32
33 如何使用这些标记呢?请看下面的具体实例
最基本的实例:
01 #匹配整个字符串
02 puts /ruby/ =~ "ruby" # 0
03 puts /ruby/ =~ "Ruby" # nil
04
05 #匹配行或字符串开头与结尾
06 str = "abcdef"
07 puts str
08 puts /^abc/ =~ str # 0
09 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!-
限定符实例
01 # 限定符
02 # * 指定零个或更多个匹配;例如 \w* 或 (abc)*。与 {0,} 相同
03 # + 指定一个或多个匹配;例如 \w+ 或 (abc)+。与 {1,} 相同
04 # ? 指定零个或一个匹配;例如 \w? 或 (abc)?。与 {0,1} 相同
05
06 # {n} 指定恰好 n 个匹配;例如 (pizza){2}
07 # {n,} 指定至少 n 个匹配;例如 (abc){2,}
08 # {n,m} 指定至少 n 个但不多于 m 个匹配。
09
10 # *? 指定尽可能少地使用重复的第一个匹配 (lazy *)
11 # +? 指定尽可能少地使用重复但至少使用一次 (lazy +)
12
13 # ?? 指定使用零次重复(如有可能)或一次重复 (lazy ?)
14
15 # {n}? 等效于{n} (lazy {n})
16 # {n,}? 指定尽可能少地使用重复,但至少使用 n 次 (lazy {n,})
17
18 # {n,m}? 指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})
19
20 puts "限定符"
21 puts "限定符:*"
22 puts /(abc)*/ =~ "a" # 0
23 puts /(abc)*/ =~ "abc" # 0
24
25
26 puts "限定符:+"
27 puts /(abc)+/ =~ "a" # nil
28 puts /(abc)+/ =~ "abc" # 0
29
30 puts "限定符:?"
31 puts /(abc)?/ =~ "c" # 0
32 puts /(abc)?/ =~ "abc" # 0
33
34
35 puts "限定符: {n}"
36 puts /(abc){2}/ =~ "abc" # nil
37 puts /(abc){2}/ =~ "abcabc" # 0
38
39 puts "限定符: {n,}"
40 puts /(abc){2,}/ =~ "abc" # nil
41 puts /(abc){2,}/ =~ "abcabc" # 0
42
43 puts "限定符: {n,m}"
44 puts /(abc){2,3}/ =~ "abc" # nil
45 puts /(abc){2,3}/ =~ "abcabcabc" # 0
46
47 puts "限定符: *?"
48 puts /(abc)*?/ =~ "a" # 0
49 puts /(abc)*?/ =~ "abcabc" # 0
50
51 puts "限定符: +?"
52 puts /(abc)+?/ =~ "a" # nil
53 puts /(abc)+?/ =~ "abcabc" # 0
54
55 puts "限定符: ??"
56 puts /(abc)??/ =~ "a" # 0
57 puts /(abc)??/ =~ "abcabc" # 0
58
59
60 #匹配, {1} {3}
61 # {3}能匹配,那{1}肯定能匹配,反过来不成立
62 # 匹配范围:{1} > {3}
常用实例:
01 puts "例子"
02 #匹配电话号码:
03 #一般中国的电话号码为7-8位,区号3-4位整数,区号第一位是0,中间用分隔符‘-’
04 #注意首尾限制符
05 pattern = /^0\d{2,3}-\d{7,8}$/
06 puts pattern =~ "010-82809999" # 0
07 puts pattern =~ "00010-82809999" # nil
08
09 #匹配手机号码
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 #
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 =~ "?uid=123" #0