搞定正则表达式

什么是正则表达式

    正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

开发中常见的正则表达式

    匹配 IP 地址 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

    匹配电子邮箱 ([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})

    匹配邮政编码 [1-9]\d{5}(?!\d)

    匹配身份证 ^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$

正则表达式中的符号

 

  1. 普通字符:abcde...
  2. 匹配字符:. [] \f \n \r \t \v \d \D \n \s \S \w \W
  3. 限定符:* + ? {}
  4. 非贪婪符号:?
  5. 条件判断符:|
  6. 分组符:()
  7. 定位符:^ $ \b \B
  8. 原义字符

下面就按照分类依次说一下正则表达式中的符号

    普通字符:就是表示其本身。如果外面想要匹配 "abcdefg" 这一字符串中的 "abc" 三个字母,我们可以这样写: abc

    匹配字符:符号 "." 会匹配 "\n" 以外的所有字符。

                       中括号 [] 表示的是字符集的意思,里面包含的字符,都是 “或” 的关系。"[a-c]" 表示的是匹配 a-c 之间的任意字                             符。"[^a-c]" 表示的是匹配 a-c 范围以外其他的字符。"[^0-8]" 表示的是匹配 0-8 范围以外的其他字符。

                       符号 “/f" 表示匹配换页符

                       符号 “/n" 表示匹配换行符

                       符号 “/r" 表示匹配回车符

                       符号 “/t" 表示匹配制表符

                       符号 “/v" 表示匹配垂直制表符

                       符号 “/d" 表示匹配匹配数字字符,等价于 "[0-9]"

                       符号 “/D" 表示匹配非数字字符,等价于 "[^0-9]"

                       符号 “/s" 表示匹配任何空白字符,等价于 "[\f\n\r\t\v]"

                       符号 “/S" 表示匹配任何非空白字符,等价于 "[^\f\n\r\t\v]"

                       符号 “/w" 表示匹配包含下划线的任意字符,等价于 "[A-Za-z0-9_]"

                       符号 “/W" 表示匹配任意非单词字符,等价于 "[^A-Za-z0-9_]"

    限定符:用来限制字符的数量,有 * + ? {}

       字符 "*",表示匹配前面的子表达式零次或多次。想匹配类似 "abbbbbbbbbbc" 这样子的字符串,中间的 "b" 字符的                                       个数我们不能确定,我们可以这样写  ab*c

                    字符 "+" 表示匹配前面的子表达式一次或多次

                    字符 "?" 表示匹配前面的子表达式零次或一次

                    字符 "{n}" 表示匹配前面子表达式 n 次。ab{2}c 会匹配 abbc,即匹配 2 个 "b"。

                    字符 "{n,}" 表示匹配前面子表达式至少 n 次

                     字符"{n,m}" 表示匹配前面子表达式至少 n 次,至多 m 次

正则表达式实例分析

分析长串的正则表达式可以分三步走:  

  1. 先对长串表达式进行分段,分段时可以查看是否有 "()",或者找具有特征的字符进行分割
  2. 对各个分段分别进行分析
  3. 将分段内容组合进行整串分析

   匹配 IP 地址的正则表达式        "((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)"

我们先总体来看,有 "()" 可以用来分段,大体可以分为三段:

  • 第一段:"((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)"
  • 第二段:"{3}"
  • 第三段:"(2[0-4]\d|25[0-5]|[01]?\d\d?)"

先看第一段 "(2[0-4]\d|25[0-5]|[01]?\d\d?)\.)",这里用 "|" 分割了三种匹配情况,相当于在第一段中又进行了小分段。

  • 第一种是 "2[0-4]\d",即三位数字,第一位是 2,第二位是 0 - 4 之间,第三位是任意数字。
  • 第二种是 "25[0-5]",三位数字,第一位是 2,第二位是 5,第三位是 0 - 5 之间。
  • 第三种是 "[01]?\d\d?",第一位是 0 或者 1,匹配零次或一次,第二位和第三位是任意数字,第三位数字匹配零次或一次,也就是 一位数,两位数,三位数都可能满足这种情况。

第一段末尾是 "\." 作为分隔符。

再来看第二段 "{3}",这个表示前面的子表达式重复三次,也就是 IP 地址的前三个字节。

再看第三段 "(2 [0-4]\d|25 [0-5]|[01]?\d\d?)",和第一段是一样的。

 

参考资料

  1.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值