通俗易懂的正则表达式

初级-元字符

  • 正则表达式由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。

通用格式 ^([]{})([]{})([]{})$

含义:开始([内容]{长度})([内容]{长度})([内容]{长度})结束

  1. [内容]
    作用:限定要找的内容包含哪些字符,默认是一个字符长度
    内容格式:

    1. [A-Z] 26个大写字母
    2. [a-z] 26个小写字母
    3. [0-9] 0至9个数字
    4. [^] 不包含

       事例: [^a] 不包含a的字符   
      
    5. , 分割符 分割事例 [a,2,3] 包含a或者2或者3字母

      事例:有个电话号码需要匹配
      格式为025-12345678
      因为我还没说长度匹配,所以该正则会有点长
      [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
      
  2. {长度}
    作用:限定要找的内容重复多少次
    长度格式:

    1. {n} 长度为n
    2. {n,m} 长度为n至m
    3. {n,} 长度为n至任意长度

      事例:
      1. 还是以上面那个025-12345678来匹配
          正则表达式为 [0-9]{3}-[0-9]{8}
      2. 如果要同时匹配 025-12345678还有25-1234
          正则表达式为[0-9]{2,3}-[0-9]{4,8}     
      
  3. ()代表域或者组的意思
    作用:

    1. 使用分歧条件(|)

      事例:匹配单词是以ing为结尾或者以ed结尾的字符串
      正则表达式为:[a-z]{0,}(ing|ed)
      
    2. 组里面的内容在替换时可以使用捕获到的字符串

      事例:abc20bcd30替换成aaa20aaa30
      正则表达式为:[a-z]{3}([0-9]{2})  替换字符为aaa$1
      
      这里面$1就是取出第一个()捕获的内容
      $0是整个表达式捕获的内容
      如果还有其他的()就依次$2,$3……一直到$9
      
    3. ^代表输入字符串的开始,$代表输入字符串的结束

      事例:有个验证码是4位的数字
      使用正则表达式: ^[0-9]{4}$
      那么该正则只能匹配内容是4位的数字的字符串
      如果使用正则表达式 [0-9]{4} 那么对于字符串“asd2348asd”也是可以匹配的
      

中级-元字符

  • 初级里的正则表达式会比较啰嗦,于是人们就弄了转义字符,来简化表达式。

内容元字符

  1. .匹配除换行符以外的任意字符
  2. \w匹配字母或数字或下划线或汉字
  3. \W匹配不是字母或数字或下划线或汉字
  4. \s匹配任意的空白符
  5. \S匹配任意不是空白符的字符
  6. \d匹配数字
  7. \D匹配不是数字的字符

    事例:有了这些内容转义字符我们上面的电话正则表达式就是可以写成\d{3}-\d{8}
    

长度元字符

  1. *重复零次或更多次,相当于{0,}
  2. +重复1次或多次,相当于{1,}
  3. ? 重复0次或1次,相当于{0,1}

    事例:匹配已a字母开头的字符串
    正则表达式: a.*
    

其他元字符

  1. \b匹配单词的开始或结束
  2. \B匹配不是单词的开始或者结束

    事例:
    1. 在字符串“i am asdf”我想匹配am 但是不想匹配as 正则表达式 \ba\w\b
    2. 在字符串 “i am asdf”匹配以a开头的单词  正则表达式 \ba\w*\b
    3. 在字符串 “i am asdf”匹配以a开头的单词并且替换成以b为开头   正则表达式 \ba(\w*)\b 替换内容 b$1
    

高级

贪婪与懒惰

  1. *? 重复任意次,但尽可能少重复
  2. +? 重复1次或更多次,但尽可能少重复
  3. ?? 重复0次或1次,但尽可能少重复
  4. {n,m}? 重复n到m次,但尽可能少重复
  5. {n,}? 重复n次以上,但尽可能少重复

    事例:
    字符串“aabab”
    使用正则表达式 a.*b (没加?就是贪婪模式) 匹配的结果是aabab
    使用正则表达式 a.*?b 匹配的结果是aab和ab
    

捕获

  1. (exp) 匹配exp,并捕获文本到自动命名的组里 事例可见初级的()事例
  2. (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以成(?’name’exp) 注意:有些地方可能不支持该语法
  3. (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

  1. (?=exp) 零宽度正预测先行断言 常用来匹配exp前面的位置
  2. (?<=exp) 零宽度正回顾后发断言 常用来匹配exp后面的位置 注意:有些地方可能不支持该语法

    事例:
    1. 字符串"reporting"我希望匹配出前面的report就可以使用\w*(?=ing)
    2. 但是如果要是想匹配porting,就不能使用(?=re)\w* ,因为匹配出来的结果是reporting,所以常用来匹配exp前面位置的字符串。
    3. 那如果我想匹配porting怎么办,使用(?<=re)\w*即可
    
  3. (?!exp) 零宽度负预测先行断言 常用来匹配后面跟的不是exp的位置
  4. (?<!exp) 零宽度负回顾后发断言 常用来匹配前面不是exp的位置 注意:有些地方可能不支持该语法

    解释:
    1. 零宽断言:用于查找在某些内容(但并不包括这些内容)之前或之后的东西,
       也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),
       因此它们也被称为零宽断言。
    2. 正预测正回顾:含义就是“等于”即表达式中的“=”
    3. 负预测负回顾:含义就是“不等于”即表达式中的“!”
    4. 先发断言与后发断言:表达式中没有"<"的就是先发断言,有"<"的就是后发断言
    

注释

  1. (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

其他内容

  1. 正则表达式还有很多内容比如平衡组,递归匹配,这些我没怎么研究就不再多说
  2. 就连替换的内容我也只是讲了其中的一点
  3. 不过掌握了初级和中级的正则表达式,基本上做很多事了。

参考资料

百度百科正则表达式
正则表达式30分钟入门教程_脚本之家
浅析正则表达式-替换原则 - BattleHeart - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值