2.5 正则表达式
1、正则表达式(Regexp)
正则表达式是对字符串操作的公式,用来过滤字符串或者从字符串中匹配出我们需要的字符,在各类语言中都有应用
2、基础操作字符
介绍一下常用的几个字符,想要了解更多功能,可以看看百科中的介绍
百度百科
https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin
字符 描述
^ 匹配字符串行首,/^a/会匹配到字符串“abc”,但不会匹配到“cba”
$ 匹配字符串行尾,/a$/会匹配到字符串“cba”,但不会匹配到“abc”
. 表示一个任意字符
\d 表示一个数字字符
\w 表示一个单词字母(包括下划线)
{n,m} 表示m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。m为空时表示无穷大
* 匹配任意次,等价于{0,}
+ 匹配一次或多次,等价于{1,}
? 匹配零次或一次,等价于{0,1}
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
() 将( ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),实际操作会经常用到,这样说比较抽象,我们下面会实际举例
3、类型转换
(1)字符串转换为正则表达式 Regexp.new(str1),可以将字符串str1转换成正则表达式,如果正则表达式里面有转义字符,需要在转义字符前面加反斜杠。
irb(main):001:0> str1 = "abc"
=> "abc"
irb(main):002:0> Regexp.new(str1)
#已经转成了正则表达式
=> /abc/
irb(main):003:0> "abcdef" =~ Regexp.new(str1)
#返回的不是nil,说明已经匹配上了
=> 0
1
2
3
4
5
6
7
8
3、正则表达式在ruby中的应用
(1)=~ 判断正则表达式是否匹配到字符串,匹配的话,返回字符串匹配字符的首个索引,否则返回nil
#定义一个匹配时间的正则表达式
irb(main):012:0> REG = /20\d{2}-?\d{2}-?\d{2}/
=> /20\d{2}-?\d{2}-?\d{2}/
#返回0,说明字符串从第一个字符开始匹配到正则表达式
irb(main):013:0> REG =~ "2018-09-08"
=> 0
#返回nil说明没有匹配上
irb(main):014:0> REG =~ "201-09-08"
=> nil
1
2
3
4
5
6
7
8
9
正则表达式解析:
这是一个匹配日期的正则表达式,我们分成两部分解释
第一部分:20\d{2}
\d{2}代表两个数字字符,总体代表20后面跟着两个数字字符,能匹配到"2018-09-08”字符串中的“2018”
第二部分:-?\d{2}
-?代表0个或者1个“-”字符,说明这个正则表达式能匹配"2018-09-08”,也能匹配“20180908”
(2)match 描述匹配的MatchData对象,如果没有匹配,则返回nil。经常与正则表达式字符中()搭配使用
#定义一个正则表达式
irb(main):018:0> REG1 = /20\d{2}-?\d{2}-?\d{2}/
=> /20\d{2}-?\d{2}-?\d{2}/
#返回一个MatchData对象,赋值到m变量中。MatchData对象可以看成一个数组。
#第一个值(索引为0)为整个正则表达式匹配到的字符串,第二个值(索引为1)为正则表达式第一个括号里面匹配到的值,以此类推。
irb(main):019:0> m = REG1.match("2018-09-08-07-06-05")
=> #<MatchData "2018-09-08">
#第一个值为/20\d{2}-?\d{2}-?\d{2}/匹配到的值
irb(main):020:0> m[0]
=> "2018-09-08"
#第二个值为正则表达式第一个括号里面匹配到的值,因为此正则表达式没有括号,所以第二个值为空
irb(main):021:0> m[1]
=> nil
#定义一个正则表达式,将20\d{2}部分用括号括起来
irb(main):023:0> REG2 = /(20\d{2})-?\d{2}-?\d{2}/
=> /(20\d{2})-?\d{2}-?\d{2}/
#返回一个MatchData对象
irb(main):024:0> m2 = REG2.match("2018-09-08")
=> #<MatchData "2018-09-08" 1:"2018">
#第一个值为/(20\d{2})-?\d{2}-?\d{2}/匹配到的值
irb(main):025:0> m2[0]
=> "2018-09-08"
#第二个值为20\d{2}括号里面的内容匹配到的值
irb(main):026:0> m2[1]
=> "2018"
irb(main):028:0> REG3 = /(20\d{2})-?(\d{2})-?(\d{2})/
=> /(20\d{2})-?(\d{2})-?(\d{2})/
#返回一个MatchData对象,m[0]为"2018-09-08",m[1]为"2018",m[2]为"09"
irb(main):029:0> m3 = REG3.match("2018-09-08")
=> #<MatchData "2018-09-08" 1:"2018" 2:"09" 3:"08">
irb(main):030:0> m3[0]
=> "2018-09-08"
irb(main):031:0> m3[1]
=> "2018"
irb(main):032:0> m3[2]
=> "09"
————————————————
版权声明:本文为CSDN博主「猫宁一」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shine_a/article/details/85094414