• 正则表达式学习笔记(三)——重复匹配


    1.有多少个匹配

    w@w.w  只能匹配a@b.c 形式,由于w 只能匹配单个字符

    1.1 匹配一个或多个字符

    使用+做为后缀,+ 匹配一个或多个字符,至少1个,不匹配0个

    例如匹配电子邮箱格式为  text@text.text

    文本 Hello,MyEmail is abcd@gmail..com ,xiaoming’sEmail is asdw.gmail.magic.com

    正则表达式  w+@w+.w+

    结果

    hello,my email is abcd@gmail.com, ,xiaoming’s Email is .sdw.gmail.magic.com

    分析:w可以匹配所有的字母和数字(以及下划线_。这个字符在电子邮件中是合法的),第一个w+匹配多个字母或数字字符,然后接一个@(@不需要转义),第二个w+匹配多个字母或数字字符,.匹配一个.(.需要转义,这里才用的.)第三个w+匹配多个字母或数字字符.

    但是这里我们漏掉了asdw.gmail.magic.com,加入要这两个都匹配出来,可以使用[w.]+@[w.]+.w+

    1.1 匹配零个或多个字符

    使用*即可。和+类似,但是+至少匹配一次,*可以一次也不匹配。

    1.2  匹配0个或一个字符

    使用元字符? 

    1.3匹配重复次数

     正则表达式的+、*、?解决了很多问题,但是有时候,我们需要精确到某一个次数,正则表达式提供了一个设置次数的语法。

    1.3.1 匹配重复次数

    {num}匹配num次,例如

    文本 1231234 12345 abcde abcedf

    正则表达式:w{5}

    结果:123 1234 12345 abcde abce5f

    1.3.2为重复匹配设定一个区间

    {num1,num2}匹配num1次到num2次之间,例如

    文本:aa11aa,aa1aa,bb111bb,bb1111aa

    正则表达式:[0-9]{2,4}

    结果:aa11aa,aa1aa,bb111bb,bb1111aa

    1.3.3 匹配至少重复多少次

    {num,}例如:

    文本:  123 1234 12345 abcde,abcedfabcdefghijk

    正则表达式: w{4,}

    结果: 123 1234 12345 abcde abcedf,abcedfabcdefghijk

    1.3.4 防止过度匹配

     

    ?只能匹配一个字符,{n}和{m,n}也有一个重复次数的上限但是对于其他的,例如+、*等没有一个上限,有时候就会导致过渡匹配的情况,例如下面这个例子

    文本: Learn English is important,but in <b>CH</b>AND<b>JP<b>,the teachingis not available.

    正则表达式:<[Bb]>.* </[Bb]>

    结果: Learn English is important,but in <b>CH</b>AND<b>JP<b>,theteaching is not available.

    分析:显然,这个.*把第第二个</b>和第三个<b>都给一网打尽,虽然没有漏掉我们所需要的文本,但是,这两个b却莫名失踪了,还多匹配了一个and

          为什么会这样呢,是因为*和+都是“贪婪型”元字符,他们在进行匹配时是多多益善的而不是适可而止的。

         解决办法:使用这些元字符的“懒惰型”版本,使其匹配尽可能的少。

    常见的贪婪型元字符和他们的懒惰型版本

    贪婪型元字符

    懒惰型元字符

    *

    *?

    +

    +?

    {n,}

    {n,}?

    正则表达式:<[Bb]>.*?</[Bb]>

    结果:LearnEnglish is  important,but in <b>CH</b>AND<b>JP<b>,theteaching is not available.

  • 相关阅读:
    使用VMware 15 安装虚拟机和使用CentOS 8
    .Net工具类--表达式目录树解析DataReader和DataTable
    .Net 获取当前周是第几周
    使用Net Mail发送邮件
    ASP.NET Core 中的 Razor 文件编译
    Sql去重一些技巧
    手动实现一个简单的IOC容器
    Portswigger-web-security-academy:OAth authentication vulnerable
    Portswigger-web-security-academy:ssrf
    Portswigger-web-security-academy:os command injection
  • 原文地址:https://www.cnblogs.com/thiaoqueen/p/7674973.html
Copyright © 2020-2023  润新知