Ruby正则表达式初探

Devon

常见用法

一个简单的示例

1
2
3
4
5
6
7
8
9
10
>> s = 'ruby on rails'
=> "ruby on rails"
>> s =~ /ruby/
=> 0
>> s[/ruby/]
=> "ruby"
>> s.slice(/ruby/)
=> "ruby"
>> s.scan(/ruby/)
=> ["ruby"]

匹配字符或字符串

1
2
3
4
>> s = 'ruby on rails, (I like ruby on rails)'
=> "ruby on rails, (I like ruby on rails)"
>> s.scan(/ruby/)
=> ["ruby", "ruby"]

数量指定

1
2
3
4
5
6
7
8
9
10
>> s = 'google'
=> "google"
>> s =~ /go?gle/
=> nil
>> s =~ /go*gle/
=> 0
>> s =~ /go{2}gle/
=> 0
>> s =~ /go{0,3}gle/
=> 0

范围指定

1
2
3
4
>>  s = 'ruby on rails, (I like ruby on rails)'
=> "ruby on rails, (I like ruby on rails)"
>> s.scan(/r[ua]/)
=> ["ru", "ra", "ru", "ra"]

特殊符号

匹配规则选项

1
2
3
4
5
6
>> s = "Ruby on rails, I like ruby"
=> "Ruby on rails, I like ruby"
>> s.scan(/ruby/)
=> ["ruby"]
>> s.scan(/ruby/i)
=> ["Ruby", "ruby"]

分支与分组

1
2
3
4
5
6
7
8
9
>> s = 'gogole'
=> "gogole"
>> s =~ /(go){2}/
=> 0

>> s = 'ruby on rails, right?'
=> "ruby on rails, right?"
>> s.gsub(/r(uby)|(ails)/, 'good')
=> "good on good, right?"

反义

1
2
3
4
>> s = "<ruby on rails>, i like <this>"
=> "<ruby on rails>, i like <this>"
>> s.scan(/<r[^>]+>/)
=> ["<ruby on rails>"]

后向引用

1
2
3
4
>> s = "a[3] + b[i] + c[0]"
=> "a[3] + b[i] + c[0]"
>> s.gsub(/\[(\w+)\]/){|x| ($1.to_i > 0 || $1 == '0') ? $1.to_i+1 : $1}
=> "a4 + bi + c1"

贪婪与懒惰

1
2
3
4
5
6
>> s = 'ababab'
=> "ababab"
>> s.scan(/a.*b/)
=> ["ababab"]
>> s.scan(/a.*?b/)
=> ["ab", "ab", "ab"]

零宽断言(?=regexp)

1
2
3
4
>> s = 'this is an example. good'
=> "this is an example. good"
>> s.scan(/\w+(?=[,.])/)
=> ["example"]

匹配电话号码

1
2
3
4
5
6
7
8
9
10
11
12
>> s = '13812345678'
=> "13812345678"
>> s =~ /^0?\d{11}$/
=> 0
>> s = '013812345678'
=> "013812345678"
>> s =~ /^0?\d{11}$/
=> 0
>> s = '0138123456783'
=> "0138123456783"
>> s =~ /^0?\d{11}$/
=> nil

切分字符串

1
2
3
4
5
>> s = "1\n--\n2\n----\n3"
=> "1\n--\n2\n----\n3"
>> s.split(/\s-{2,}\s/)
=> ["1", "2", "3"]
>>

替换字符内容

1
2
3
4
5
6
7
8
9
>> s = 'ruby on rails, (I like ruby on rails)'
=> "ruby on rails, (I like ruby on rails)"
>> s.gsub(/\(.+\)/, 'hello')
=> "ruby on rails, hello"

>> s = "11,22"
=> "11,22"
>> s.gsub(/\d+/){|x| x.to_i+1}
=> "12,23"

作业

参考资料