Ruby正规表达式

#构造正则表达式的3种方式   
puts a=Regexp.new('^s*[a-z]')   
b=/^s*[a-z]/   
c=%r{^\s*[a-z]}   
  
name="Fats Waller"  
puts name=~/a/  #返回 a 的字符位置   
name=~/z/   
puts /a/=~name   
  
def show_regexp(a,re)   
  if a=~re   
    "#{$`}<<#{$&}>>#{$'}" #$`得到匹配之前的那部分字符串,$&得到匹配那部分字符串,$'得到匹配之后那部分字符串   
  else  
    "no match"  
  end  
end  
  
#特殊字符 . | ( ) [ ] { } + \ ^ $ *  ?    
#之前放置 \ 匹配它们的字面量   
  
puts show_regexp('very interesting',/t/)   
puts show_regexp('yes|no',/\|/) #\|匹配 |   
puts show_regexp('yes (no)',/\(no\)/) #\( , \)   
  
#位置匹配 ^ 行首 $行尾 \A字符串开始 \z和\Z 匹配字符串的结尾   
puts show_regexp("this is\nthe time",/^the/)   
puts show_regexp("this is\nthe time",/is$/)   
puts show_regexp("this is\nthe time",/\Athis/)   
puts show_regexp("this is\nthe time",/\Athe/)   
puts "sso good".gsub!(/\z/,"p")   
puts "sso".gsub!(/.$/,"p")   
puts "sos".gsub!(/.\z/,"a")   
  
#\b 匹配词的边界 \B匹配非词的边界   
puts show_regexp("this is\nthe time",/\bis/)   
puts show_regexp("this is\nthe time",/\Bis/)   
  
  
#字符类 处于方括号之间的集合   
#[:digit:]是POSIX字符类   
puts show_regexp("Price $12.",/[aeiou]/)   
puts show_regexp("Price $12.",/[\s]/)   
puts show_regexp("Price $12.",/[[:digit:]]/)   
puts show_regexp("Price $12.",/[[:space:]]/)   
puts show_regexp("Price $12.",/[[:punct:]aeiou]/)   
  
a='see [Design Patterns-page 123]'   
puts show_regexp(a,/[A-Fa-f]/)   
puts show_regexp(a,/[0-9][0-9]/)   
puts show_regexp(a,/[\]]/)   
puts show_regexp(a,/[-]/)   
puts show_regexp(a,/[^a-z]/)   
puts show_regexp(a,/[^a-z\s]/)   
  
puts show_regexp(a,/\d/)   
  
#.匹配除回车换行符之外的任何字符(在多行模式下它也匹配回车)   
a='It costs $12.'   
puts show_regexp(a,/c.s/)   
puts show_regexp(a,/./)   
puts show_regexp(a,/\./)   
  
#重复   
#r代表模式内先前的正则表达式   
#r* 匹配零个或多个r的出现   
#r+ 匹配1个或多个r的出现   
#r? 匹配0个或1个r的出现   
#r{m,n} 匹配至少"m"次r和最多"n"次的出现   
#r{m,} 匹配至少"m"次r的出现   
#r{m} 只匹配"m"次r的出现   
  
a="the moon is made of cheese"  
puts show_regexp(a,/\w+/)   
puts show_regexp(a,/\s.*\s/)   
puts show_regexp(a,/\s.*?\s/)   
puts show_regexp(a,/[aeiou]{2,99}/)   
puts show_regexp(a,/mo?o/)   
  
#替换   
#|匹配它之前或之后的正则表达式   
a="red ball blue sky"  
puts show_regexp(a,/d|e/)   
puts show_regexp(a,/al|lu/)   
puts show_regexp(a,/red ball|angry sky/)   
  
puts show_regexp('banana',/an*/)   
puts show_regexp('banana',/(an)*/)   
puts show_regexp('banana',/(an)+/)   
puts show_regexp(a,/blue|red/)   
puts show_regexp(a,/(blue|red) \w+/)   
puts show_regexp(a,/red|blue \w+/)   
puts show_regexp(a,/red (ball|angry) sky/)   
  
a='the red angry sky'   
puts show_regexp(a,/red (ball|angry) sky/)   
  
#括号也收集模式匹配的结果   
"12:50am"=~/(\d\d):(\d\d)(..)/   
puts "Hour is #$1,minute #$2"  
"12:50am"=~/((\d\d):(\d\d))(..)/   
puts "Time is #$1"  
puts "Hour is #$2,minute #$3"  
puts "AM/PM is #$4"  
  
#\1 表示第一个组的匹配 \2表示第二个组的匹配   
puts show_regexp('He said "Hello"',/(\w)\1/)   
puts show_regexp('Mississipi',/(\w+)\1/)   
  
#也可以向后引用去匹配分界符号   
puts show_regexp('He said "Hello"',/(["']).*?\1/)  
puts show_regexp("He said 'Hello'",/(["']).*?\1/)   
  
#基于模式的替换   
  
a="the quick brown fox"  
puts a.sub(/[aeiou]/,'*')   
puts a.gsub(/[aeiou]/,'*')   
puts a.sub(/\s\S+/,'')   
puts a.gsub(/\s\S+/,'')   
  
a="the quick brown fox"  
puts a.sub(/^./){|match|match.upcase}   
puts a.gsub(/[aeiou]/){|vowel|vowel.upcase}   
  
def mixed_case(name)   
  name.gsub(/\b\w/){|first|first.upcase}   
end  
  
#替换中的反斜线序列   
puts mixed_case("fats waller")   
puts "fred:smith".sub(/(\w+):(\w+)/,'\2,\1')   
puts "nercpyitno".gsub(/(.)(.)/,'\2\1')   
  
#\&(最后的匹配),\+(最后匹配的组),\'(匹配之前的字符串),\\(字面量反斜线)   
str='a\b\c'   
puts str.gsub(/\\/,'\\\\\\\\')   
puts str.gsub(/\\/,'\&\&')   
puts str.gsub(/\\/){'\\\\'}   
  
  
#面向对象的正则表达式   
re=/(\d+):(\d+)/   
md=re.match("Time: 12:34am")   
puts md[0] # ==$&   
puts md[1] #==$1   
puts md[2] # ==$2   
puts md.pre_match # == $`   
puts md.post_match # ==$'   
  
#$~保存线程局部变量   
re=/(\d+):(\d+)/   
md1=re.match("Time: 12:34am")   
md2=re.match("Time: 10:30pm")   
puts [$1,$2]   
$~=md1   
puts [$1,$2]  

你可能感兴趣的:(C++,c,正则表达式,SSO,Ruby)