CQ-CSER

web设计开发爱好者

正则表达式——极速入门

Posted on | 一月 15, 2010 | No Comments

正则表达式:

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

 

正则表达式中常用的标记

^    |   行或字符串开头
$    |   行或字符串末尾
.    |   除换行符外的字符
\w   |   单词字符 (数字、字母或下划线)
\W   |   非单词字符
\d   |   数字(等同于【0-9】)
\D   |   非空白字符

\A   |   字符串开头
\Z   |   字符串末尾或最后的换行符钱
\z   |   字符串末尾

\s   |   空白字符
\S   |   非空白字符

\b   |   单词边界(【】外)
\B   |   非单词边界
\b   |   退格(在【】内)
[]   |   集合中的任何一个字符,中间使用连字符,则表示范围,如:[0-9],[a-z]
?    |   0或1个之前的表达式
|    |   或
( ) |   子表达式编组

*    |   零或多个之前的表达式
*?   |   零或多个之前的表达式(非贪婪)
+    |   1个或多个之前的表达式
+?   |   1个或多个之前的表达式(非贪婪)
{m,n}|   m-n个之前的表达式
{m,n}? | m-n个之前的表达式(非贪婪的)

还有{?=} {?!} (?>) (?#) (?imx-imx)等

如何使用这些标记呢?请看下面的具体实例

 

最基本的实例:

 

#匹配整个字符串
puts /ruby/ =~ "ruby"   # 0
puts /ruby/ =~ "Ruby"   # nil

#匹配行或字符串开头与结尾
str = "abcdef"
puts str
puts /^abc/ =~ str   # 0
puts /def$/ =~ str   # 3

str = "abc\ndef\n"
puts /^abc/ =~ str   # 0
puts /def$/ =~ str   # 4
puts /abc/ =~ str    # 0
puts /def/ =~ str    # 4

#匹配字符串本身的开头和结尾
str = "abc\ndef\n"
puts /\Aabc/ =~ str    # 0
puts /def\Z/ =~ str    # 4
puts /def\z/ =~ str    # nil

#匹配单词字符
puts "匹配单词字符"
pattern = /\w/
puts pattern =~ "abc"  # 0
puts pattern =~ "."    # nil

#匹配整数
# \d 数字
# \D 非数字
puts "匹配数字"
puts /\d/ =~ "122"   #0
puts /\D/ =~ "122"   #nil
puts /\D/ =~ "abc"   #0

#边界
str = "This is your friend!"
puts str
puts str.gsub(/\b/,"|")   # |This| |is| |your| |friend|!
puts str.gsub(/\B/,"-")   # T-h-i-s i-s y-o-u-r f-r-i-e-n-d!-

限定符实例

 

 

# 限定符
# * 指定零个或更多个匹配;例如 \w* 或 (abc)*。与 {0,} 相同
# + 指定一个或多个匹配;例如 \w+ 或 (abc)+。与 {1,} 相同
# ? 指定零个或一个匹配;例如 \w? 或 (abc)?。与 {0,1} 相同

# {n} 指定恰好 n 个匹配;例如 (pizza){2}
# {n,} 指定至少 n 个匹配;例如 (abc){2,}
# {n,m} 指定至少 n 个但不多于 m 个匹配。

# *? 指定尽可能少地使用重复的第一个匹配 (lazy *)
# +? 指定尽可能少地使用重复但至少使用一次 (lazy +)

# ?? 指定使用零次重复(如有可能)或一次重复 (lazy ?)

# {n}? 等效于{n} (lazy {n})
# {n,}? 指定尽可能少地使用重复,但至少使用 n 次 (lazy {n,})

# {n,m}? 指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})

puts "限定符"
puts "限定符:*"
puts /(abc)*/ =~ "a"      # 0
puts /(abc)*/ =~ "abc"    # 0

puts "限定符:+"
puts /(abc)+/ =~ "a"      # nil
puts /(abc)+/ =~ "abc"    # 0

puts "限定符:?"
puts /(abc)?/ =~ "c"      # 0
puts /(abc)?/ =~ "abc"    # 0

puts "限定符: {n}"
puts /(abc){2}/ =~ "abc" # nil
puts /(abc){2}/ =~ "abcabc" # 0

puts "限定符: {n,}"
puts /(abc){2,}/ =~ "abc" # nil
puts /(abc){2,}/ =~ "abcabc" # 0

puts "限定符: {n,m}"
puts /(abc){2,3}/ =~ "abc" # nil
puts /(abc){2,3}/ =~ "abcabcabc" # 0

puts "限定符: *?"
puts /(abc)*?/ =~ "a"      # 0
puts /(abc)*?/ =~ "abcabc" # 0

puts "限定符: +?"
puts /(abc)+?/ =~ "a"      # nil
puts /(abc)+?/ =~ "abcabc" # 0

puts "限定符: ??"
puts /(abc)??/ =~ "a"      # 0
puts /(abc)??/ =~ "abcabc" # 0

#匹配, {1} {3}
# {3}能匹配,那{1}肯定能匹配,反过来不成立
# 匹配范围:{1} > {3}

常用实例:

 

 

puts "例子"
#匹配电话号码:
#一般中国的电话号码为7-8位,区号3-4位整数,区号第一位是0,中间用分隔符‘-’
#注意首尾限制符
pattern = /^0\d{2,3}-\d{7,8}$/
puts pattern =~ "010-82809999"   # 0
puts pattern =~ "00010-82809999" # nil

#匹配手机号码
# 1开头,第二位为3、5、8,11位数字
pattern = /^1[3,5,8]\d{9}$/
puts pattern =~ "15810990001"  #0

#身份证号码
pattern = /\d{18}|d{15}/

#匹配IP
#四组不大于255的整数组成,中间用'.'分隔
puts "IP"
num = /^\d|[01]?\d{1,2}|2[0-4]\d|25[0-5]/
pattern = /^(#{num}\.){3}#{num}$/
#一个整体: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]$/
puts pattern =~ "127.0.0.1"    # 0
puts pattern =~ "254.255.255.255"

#匹配电子邮箱
pattern = /^\w+@\w+.\w+$/         #这个没有 ‘-’
pattern = /^[\w-]+@[\w-]+.[\w-]+$/
puts pattern =~ "abc@gmail.com"  #0

# 匹配url
# http://www.google.cn
pattern = /(http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(((\/[\~]*|\\[\~]*)
(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*/

puts pattern =~ "http://www.google.cn?uid=123"  #0

评论|Comments

留言|Leave a Reply





  • 微波:

    既然要赌,就要赌到底,玩命才会WIN
  • SUNSHINE

  • About

    本博客采用创作共用版权协议,要求署名、非商业用途和保持一致. 转载本博客内容也遵循“署名-非商业用途-保持一致”的创作共用协议.

    订阅

    Search

    Admin