美文网首页
2.5 正则表达式

2.5 正则表达式

作者: ibob2012 | 来源:发表于2019-08-19 15:12 被阅读0次

    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

    相关文章

      网友评论

          本文标题:2.5 正则表达式

          本文链接:https://www.haomeiwen.com/subject/eiossctx.html