正则表达式

一、几个常用规则

(一)完全匹配

  • 正则表达式是用来匹配文本的,现在假设我们要匹配 “abcdefg” 这一字符串中的 “abc” 三个字母,我们该怎么写呢?

    1
    2
    abc
    复制代码
  • 如果正则表达式的匹配内容很简单,也很明确,可以进行完全匹配,写出来的结果就是这样的。

(二)一些常用字符

1、符号 |

  • "|" 这个字符,表示 或,即匹配 ab 或者 ef

    1
    2
    3
    4
    5
    6
    //  要求:在 "acabcdefgh acbbcdefgh accbcdefgh" 字符串中,要匹配 "abcdef","bbcdef","cbcdef" 三个子串

    abcdef|bbcdef|cbcdef

    写法正确,不过略显繁琐。我们的写法如下:
    (a|b|c)bcdef

2、符号 []

  • 中括号是字符集的意思( 集合 ),里面包含的字符,都是或(”|”)的关系

    1
    2
    3
    4
    5
    ac[a-c]bcdef
    // "[a-c]" 表示的是匹配 a-c 之间的任意字符。

    [^a-c]
    // 匹配 a-c 范围以外其他的字符 ^搭配[]使用,取反的作用

3、限制符号 * + ? {}

  • 简析

    1
    2
    3
    4
    5
    {n,m}   //  表示匹配前面子表达式至少N次,最多m次

    * // 等价于 {0,} 匹配前面子表达式,0次或者多次
    + // 等价于 {1,} 匹配前面子表达式,1次或者多次
    ? // 等价于 {0,1} 匹配前面子表达式,0次或者1次

4、几个转义字符

  • "\d" 表示匹配数字字符,等价于 “[0-9]”。

  • "\D" 表示匹配非数字字符,等价于 “[^0-9]”。

  • "\n" 表示匹配换行符。

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

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

5、符号 .

  • 符号 "." 会匹配 “\n” 以外的所有字符,也是比较常用的。

6、符号 ?

  • "?" 符号的非贪婪匹配

  • 限制字符 “* + ? {}” 默认的匹配规则是贪婪的。什么意思呢?

    比如说有一个字符串 “abbbbb”,我们使用正则表达式 “ab+” 去匹配,匹配的结果是 “abbbbb”,会尽可能多的去匹配满足的字符。

    我们如果想尽可能少的匹配满足的字符,那么就在限定符后面加 “?”。

7、符号 ()

  • 小括号的含义是分组,可以理解为被小括号包含的子表达式就是一个分组

二、例子简析

1、例子1

  • ** 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?)\.)",这里用 “|” 分割了三种匹配情况。

    1
    2
    3
    4
    //  第一种是 "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?)”,和第一段是一样的

2、例子2

  • 匹配电子邮箱:”([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})”
  • 第一段 "([a-z0-9_\.-]+)",表示匹配 a-z 范围内的字母,0-9 范围的数字,以及 “_”,”.”,”-“ 三个字符,”+” 表示至少有一个字符
  • 第二段 "@" 表示匹配 “@” 字符
  • 第三段 "([\da-z\.-]+)",”\d” 表示匹配任意数字,a-z 范围的字母,”.”,”-“ 两个字符,”+” 至少有一个字符。
  • 第四段 "\." 表示匹配 “.” 字符
  • 第五段 "([a-z\.]{2,6})",表示匹配 a-z 范围的字母,”.” 字符,”{2,6}” 表示至少 2 个字符,至多 6 个字符