微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

第七章:使用子表达式

文本:

  Hello,my name is changlezhong  and my age is 18.

正则表达式:

   {2,}

结果:

  Hello,my name is changlezhong  and my age is 18.

分析:

  结果什么也没匹配到,因为 {2,}只能匹配 ;;这样的文本,无法匹配  。所以就引入了子表达式。

7.1 子表达式:

  子表达式使用 ( ) 括起来

注意:

  ( 和 ) 是元字符,要相匹配其本身必须对其进行转义。

  正则表达式:

    ( ){2,}

  结果:

    Hello,my name is changlezhong  and my age is 18.

  分析:

    ( )是一个子表达式,它将被视为一个独立的元素,而紧跟在后面的{2,}将作用于这个子表达式(不仅仅是分号)。

一个例子,匹配ip地址:

  文本:

    pinging hog.forta.com [12.159.46.200] whith 32 byte of data

  正则表达式:

    \d{1,3}\.\d{1,3}

  结果:

    pinging hog.forta.com [12.159.46.200] whith 32 byte of data

  使用子表达式进行简化:

    (\d{1,3}\.){3}\d{1,3}

匹配下面文本的年份:

  文本:

    ID:042

    SEX:M

    dob:1997-08-18

    Status:Active

  正则表达式:

    19|20\d{2}

  结果:

    ID:042

    SEX:M

    dob1997-08-18

    Status:Active

  分析:

    19|20\d{2}表示19或者20开头的四位数字,应该将19|20作为一个子表达式,所以正确的正则表达式为 (19|20)\d{2}

7.3 子表达式嵌套:

  匹配ipV4的ip:ipV4由四组数字组成,ip地址都是(1~255).(0~255).(0~255).(0~255)的格式

  文本:

    pinging hog.forta.com [12.159.46.200] whith 32 byte of data

  分析:

    1. 任何一个1位或2位的数字

    2. 任何一个以1开头的3位数字

    3. 任何一个以2开头、第2位数字在0-4之间的3位数字

    4. 任何一个以25开头,第3位数字在0-5之间的3位数字

  正则表达式:

    (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

  结果:

    pinging hog.forta.com [12.159.46.200] whith 32 byte of data

注意:

  上面的写法有些漏洞,|(或)匹配的时候将两位的匹配放在了三位的前面导致最后匹配到两位数字的时候就不再匹配,实际最后一组的数字为三位,所以应该将三位的匹配规则放在两位和一位之前。

  正确的正则表达式:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐