正则表达式入门_多字符匹配

来源:互联网 发布:ip网络音柱 编辑:程序博客网 时间:2024/06/07 11:44

1.多字符匹配模式

  • 字符串 application
  • 模式 ap+
  • 结果 [app]lication

    ‘+’是一个元字符,表示匹配一个或多个该元字符紧跟的单字符或者子表达式。例如模式:(ab)+则表示匹配一个或多个子表达式(ab)。 子表达式简单的说就是在()内的表达式,子表达式是一个独立元素,特殊元字符可以作用于独立元素

  • 字符串 application
  • 模式 apply*
  • 结果 [appl]ication

    ‘*’是一个元字符,表示匹配零次或多次元字符紧跟的单字符或者子表达式

  • 字符串 www.csdn.com
  • 模式 w?.
  • 结果 ww[w.]csdn.com

    ‘?’是一个元字符,表示匹配零次或一次元字符紧跟的单字符或者子表达式
    以上三种元字符可以实现多字符匹配,但实际应用时,有时需要指定匹配次数,正则表达式提供元字符{}指定。

  • 字符串 www.csdn.com
  • 模式 w{3}
  • 结果 [www].csdn.com

    {}表示匹配指定值次数的元字符紧跟的单字符或者子表达式,此处指定为3次,因此可以匹配www,此处还可以指定范围,例如{0,3}表示匹配0次到3次单字符w。如果范围不确定,可以指定至少匹配几次,例如{3,},表示至少匹配3次单字符w。

    以上三种元字符可以实现重复匹配,但是需要注意的是,这三种元字符使用的是贪婪模式,也就是说,模式会尽可能多的获取匹配。这样会带了一些问题,如下

  • 字符串 codeblock1/code codeblock2/code
  • 模式 code.*\/code
  • 结果 [codeblock1/code codeblock2/code]

    可以发现即便block1就已经可以实现匹配了,但是模式仍然将block2匹配了进来。这就是由于*本身是贪婪型字符。我们可以在其后面加上?元字符表示使用懒惰匹配模式。

2.位置匹配

  • 字符串 cat category
  • 模式 cat
  • 结果 [cat] [cat]egroy

    模式cat会匹配到两个结果(上一篇文章所说的只匹配第一个结果依然正确,只不过在不同语言的实现中,同一个模式支持匹配所有的结果,在之后的例子中,采用一个模式多匹配的方式来展示正则表达式的部分实现以及解决的问题。)。但明显category中的cat只是这个单词的一部分,如果我们将匹配出来的cat都替换为dog,那么dogegroy是个毫无意义的单词,因此如果只想匹配cat这个单词本身,需要用到单词边界

  • 字符串 cat category
  • 模式 \bcat\b
  • 结果 [cat] category

    \b即为单词边界,b是boundray首字母缩写,\b匹配的是\w和\W之间的字符,也就是说一个可以组成单词的字符和一个不可以组成单次的字符之间的字符。用作为单次边界。此处t为\w,’ ’为\W。category中,t为\w,e为\w。因此不匹配。警告许多正则表达式实现中不支持\b

  • 字符串 cat category
  • 模式^cat$
  • 结果 cat category

    ^是一个特殊元字符,当它在字符集合中时表示否定,如[^0-9]表示匹配非数字的字符。但是在其它情况下,^表示一个字符串的开头,$如果在结尾表示匹配一个字符串的结尾。因此字符串没有得到匹配。

  • 字符串
  • cat
  • cat1
  • cat2
  • 模式(?m)^cat
  • 结果
  • [cat]
  • [cat1]
  • [cat2]

    (?m) 在正则表达式的开始时,表示开启分行匹配模式,此时的^不再仅仅表示字符串的开头,而是每行字符串的开头。$同理。警告:同样许多正则表达式实现中不支持开启分行匹配模式。

3.回溯引用

在正则表达式的实际应用过程中,同一个模式有很多元素匹配后需要再次匹配,此时需要使用回溯引用。回溯引用指的是模式的后半部分引用前半部分定义的子表达式

  • 字符串 <h1></h1><h2></h3>
  • 模式 <h\d></h\d>
  • 结果 [<h1></h1>][<h2></h3>]

    如果不适用回溯引用,可以看到h2标签是错误的,但是也被匹配了出来。

  • 字符串 <h1></h1><h2></h3>
  • 模式 <(h\d)></\1>
  • 结果 [<h1></h1>]<h2></h3>

    模式中的回溯引用为\1,表示的是模式中第一个子表达式,该模式只用一个子表达式就是(h\d),(h\d)匹配字符串时,第一次匹配到了h1,因此\1的位置也为h1。第二次匹配时,(h\d)匹配到了h2,模式实际上为<(h2)></h2>。因此不能匹配h3,所以整个模式只匹配到了一个结果。
    回溯引用通常都是从1开始的,\0表示的是整个模式。

4.向前查找、向后查找

  • 字符串 15:00CHN3:00US
  • 模式 \d+:\d+(?=CHN)
  • 结果 [15:00]CHN3:00US

    向前查找使用以?=开头的子表达式,?=后紧跟的是需要匹配的文本。当前模式表示匹配CHN之前的时间,这里匹配的CHN但是没有消费(有些正则表达式文档中使用“消费”来描述“匹配和返回文本”的含义。)

  • 字符串 15:00CHN3:00US
  • 模式 \d+:\d+(?<=CHN)
  • 结果 15:00CHN[3:00]US

    向后查找使用?<=开头的子表达式,?<=后紧跟的是需要匹配的文本。