第七章:使用子表达式

文本:

  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}\.\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

    DOB:1997-08-18

    Status:Active

  分析:

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

7.2 子表达式嵌套:

  匹配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

注意:

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

  正确的正则表达式:

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

备注:

  一般来说ip验证匹配都只是i纯ip文本校验 : ^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((1\d{2})|(2[0-4]\d)|(25[0-5])|(\d{1,2}))$

 

posted on 2018-05-29 07:31  changlezhong  阅读(134)  评论(0编辑  收藏  举报

导航