2.5 正则表达式

2019-08-19  本文已影响0人  ibob2012

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

上一篇下一篇

猜你喜欢

热点阅读