博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ruby 正则表达式
阅读量:4230 次
发布时间:2019-05-26

本文共 6922 字,大约阅读时间需要 23 分钟。

子串

[1] pry(main)> "Do you like cats?" =~ /like/=> 7[2] pry(main)> "Do you like cats?" =~ /lie/=> nil[3] pry(main)> "Do you like cats?".match(/like/)=> #
[4] pry(main)> "Do you like cats?".match(/lie/)=> nil

字符

[1] pry(main)> "test" =~ /[aeiou]/=> 1[2] pry(main)> "sky" =~ /[aeiou]/=> nil

数字

[4] pry(main)> "The year is 2020" =~ /[0-9]/=> 12[5] pry(main)> "The cat is black" =~ /[0-9]/=> nil

转义

[11] pry(main)> "5a5" =~ /\d.\d/=> 0[12] pry(main)> "5a5" =~ /\d\.\d/=> nil[13] pry(main)> "5.5" =~ /\d\.\d/=> 0

IP

[14] pry(main)> "192.168.1.1" =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/=> 0[15] pry(main)> "0000.0000" =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/=> nil

精确匹配

[16] pry(main)> "Regex are cool" =~ /\w/=> 0[17] pry(main)> "Regex are cool" =~ /\w{4}/=> 0[18] pry(main)> "Regex are cool" =~ /^\w{4}$/=> nil

捕捉组

[2] pry(main)> "12:41 INFO User has logged in." =~ /(\d{2}:\d{2}) (\w+) (.*)/=> 0[4] pry(main)> "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)=> #
[5] pry(main)> $1=> "12:41"[6] pry(main)> $2=> "INFO"[7] pry(main)> $3=> "User has logged in."------------------------------------------------------------[13] pry(main)> aa = "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)=> #
[14] pry(main)> aa[0]=> "12:41 INFO User has logged in."[15] pry(main)> aa[1]=> "12:41"[16] pry(main)> aa[2]=> "INFO"[17] pry(main)> aa[3]=> "User has logged in."[18] pry(main)> aa[4]=> nil------------------------------------------------------------# 使用 (?:) 过滤不需要捕获的模式[7] pry(main)> aa = "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)=> #
[8] pry(main)> aa = "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (?:\w+) (.*)/)=> #
[9] pry(main)> aa = "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) \w+ (.*)/)=> #

$`,$&,$'

[22] pry(main)> "ABCDEFGH".match /.C/=> #
[23] pry(main)> $`=> "A"[24] pry(main)> $&=> "BC"[25] pry(main)> $'=> "DEFGH"

命名组

[33] pry(main)> m = "David 30".match /(?
\w+) (?
\d+)/=> #
[34] pry(main)> m[:name]=> "David"[35] pry(main)> m[:age]=> "30"[36] pry(main)> $1=> "David"[37] pry(main)> $2=> "30"

用 =~ 进行匹配无法在其他地方用命名使用匹配组,命名数组的结果会返回一个 MatchData 对象,可通过这个对象读取结果。

生成正则表达式

[64] pry(main)> regexp = Regexp.new("(?<=\w) (\d+)")=> /(?<=w) (d+)/[65] pry(main)> %r((?<=\w) (\d+))=> /(?<=\w) (\d+)/[66] pry(main)> %r[(?<=\w) (\d+)]=> /(?<=\w) (\d+)/[67] pry(main)> %r!(?<=\w) (\d+)!=> /(?<=\w) (\d+)/

正则表达式选项

Options Option constants Description
i Regexp::IGNORECASE 大小写不敏感
m Regexp::MULTILINE . 可以匹配换行符
x Regexp::EXTENDED 忽略表达式中的空格
[145] pry(main)> "abc" =~ /[A-Z]/=> nil[146] pry(main)> "abc" =~ /[A-Z]/i=> 0[101] pry(main)> "abc".match?(/[A-Z]/)=> false[102] pry(main)> "abc".match?(/[A-Z]/i)=> true
[127] pry(main)> "hello\nworld" =~ /ll.*l/=> nil[128] pry(main)> "hello\nworld" =~ /ll.*l/m=> 2[141] pry(main)> "hello\nworld".match?(/ll.*l/)=> false[142] pry(main)> "hello\nworld".match?(/ll.*l/m)=> true
[137] pry(main)> "hello world" =~ /w  o/=> nil[138] pry(main)> "hello world" =~ /w  o/x=> 6[143] pry(main)> "hello world".match?(/w  o/)=> false[144] pry(main)> "hello world".match?(/w  o/x)=> true

格式化长表达式

[107] pry(main)> LOG_FORMAT = %r{[107] pry(main)*   (\d{2}:\d{2}) # Time[107] pry(main)*   \s(\w+)       # Event type[107] pry(main)*   \s(.*)        # Message[107] pry(main)* }x=> /  (\d{2}:\d{2}) # Time  \s(\w+)       # Event type  \s(.*)        # Message/x[108] pry(main)> "12:41 INFO User has logged in.".match LOG_FORMAT=> #
[109] pry(main)> $1=> "12:41"[110] pry(main)> $2=> "INFO"[111] pry(main)> $3=> "User has logged in."

scan

匹配字符串中所有满足表达式的选项

匹配字符串的所有词

[112] pry(main)> "this is some string".scan(/\w+/)=> ["this", "is", "some", "string"]

匹配字符串的所有数字

[114] pry(main)> "The year was 1492.".scan(/\d+/)=> ["1492"]

大写所有词的首字母

[118] pry(main)> "lord of the rings".gsub(/\w+/){|word| word.capitalize}=> "Lord Of The Rings"

验证给定的邮件地址

[122] pry(main)> !!"Looking@example.com".match(/\A[\w.+-]+@\w+\.\w+\z/)=> true[123] pry(main)> !!"Looking@examplecom".match(/\A[\w.+-]+@\w+\.\w+\z/)=> false[124] pry(main)> !!"Lookingexample.com".match(/\A[\w.+-]+@\w+\.\w+\z/)=> false[125] pry(main)> "Lookingexample.com".match?(/\A[\w.+-]+@\w+\.\w+\z/)=> false

重复

[17] pry(main)> "hello rubyy".match /ruby?/=> #
[18] pry(main)> "hello rub".match /ruby?/=> #
[19] pry(main)> "hello rubty".match /ruby*/=> #
[20] pry(main)> "hello rub".match /ruby*/=> #
[21] pry(main)> "hello rubyy".match /ruby*/=> #
[24] pry(main)> "hello rub".match /ruby+/=> nil[25] pry(main)> "hello ruby".match /ruby+/=> #
[26] pry(main)> "5 days".match /\d{3}/=> nil[27] pry(main)> "567 days".match /\d{3}/=> #
[28] pry(main)> "5679 days".match /\d{3}/=> #
[29] pry(main)> "5679 days".match /\d{3,}/=> #
[33] pry(main)> "5679 days".match /\d{3,5}/=> #
[34] pry(main)> "567890 days".match /\d{3,5}/=> #

贪婪匹配

[35] pry(main)> " perl>".match /<.*>/=> #
perl>">[36] pry(main)> "
perl>".match /<.*?>/=> #
">

反向引用

[39] pry(main)> "Ruby&Rails Ruby&rails".match /([Rr])?uby&\1ails/=> #

搜索替换

[64] pry(main)> phone = "138-3453-1111 #这是一个电话号码"=> "138-3453-1111 #这是一个电话号码"[65] pry(main)> phone.sub!(/#.*$/, "") => "138-3453-1111 "[66] pry(main)> phone.gsub!(/\D/, "")  => "13834531111"[69] pry(main)> text = "rails 是 rails,  Ruby on Rails 非常好的 Ruby 框架"=> "rails 是 rails,  Ruby on Rails 非常好的 Ruby 框架"[70] pry(main)> text.gsub!("rails", "Rails")=> "Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架"[71] pry(main)> text = "rails 是 rails,  Ruby on Rails 非常好的 Ruby 框架"=> "rails 是 rails,  Ruby on Rails 非常好的 Ruby 框架"[72] pry(main)> text.gsub!(/\brails\b/, "Rails")=> "Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架"[76] pry(main)> text = "rails 是rails,  Ruby on Rails 非常好的 Ruby 框架"=> "rails 是rails,  Ruby on Rails 非常好的 Ruby 框架"[77] pry(main)> text.gsub!(/\brails\b/, "Rails")=> "Rails 是rails,  Ruby on Rails 非常好的 Ruby 框架"
[46] pry(main)> "ruby??".match /ruby(!+|\?)/=> #
[47] pry(main)> "ruby??".match /ruby[!+|\?]/=> #
[48] pry(main)> "ruby".match /ruby[!+|\?]/=> nil[49] pry(main)> "ruby!".match /ruby[!+|\?]/=> #

实例 描述
/^Ruby/ 匹配以 "Ruby" 开头的字符串或行
/Ruby$/ 匹配以 "Ruby" 结尾的字符串或行
/\ARuby/ 匹配以 "Ruby" 开头的字符串
/Ruby\Z/ 匹配以 "Ruby" 结尾的字符串
/\bRuby\b/ 匹配单词边界的 "Ruby"
/\brub\B/ \B 是非单词边界:匹配 "rube" 和 "ruby" 中的 "rub",但不匹配单独的 "rub"
/Ruby(?=!)/ 如果 "Ruby" 后跟着一个感叹号,则匹配 "Ruby"
/Ruby(?!!)/ 如果 "Ruby" 后没有跟着一个感叹号,则匹配 "Ruby"
[53] pry(main)> "Ruby".match /Ruby(?!!)/=> #
[54] pry(main)> "Ruby!".match /Ruby(?!!)/=> nil[55] pry(main)> "Ruby!".match /Ruby(?=!)/=> #
[56] pry(main)> "Ruby".match /Ruby(?=!)/=> nil[60] pry(main)> "Ruby".match /\bRub\B/=> #
[61] pry(main)> "Rub".match /\bRub\B/=> nil[62] pry(main)> " Rub".match /\bRub\B/=> nil[63] pry(main)> " Ruby".match /\bRub\B/=> #

 

转载地址:http://ujjqi.baihongyu.com/

你可能感兴趣的文章
谈谈python里面那些高级函数
查看>>
40行代码带你免费看《海贼王-和之国》篇章
查看>>
搭建炫酷的服务器监控平台
查看>>
垃圾分类:人机搭配,干活不累
查看>>
Nginx
查看>>
Memcached,session共享
查看>>
Tomcat,varnish
查看>>
SVN, 制作RPM包
查看>>
HTML 标签说明
查看>>
CSS 基本语法
查看>>
10.shell基础
查看>>
加密与解密、抓包扫描
查看>>
16.一级目录、历史命令,du,date,zip,快捷方式
查看>>
MySQL的基本管理
查看>>
MySQL 表结构与键值
查看>>
MySQL存储引擎,表记录管理
查看>>
Mysql多表查询语句,授权用户与密码更改
查看>>
MySQL 备份与恢复
查看>>
采用IC传感器的相对湿度测量
查看>>
皮带传动实验
查看>>