正则表达式基础

元字符

  • ^:匹配字符串的开始;
  • $:匹配字符串的结束;
  • |:表分枝条件「或」,范围就是当前表达式(或子表达式);
  • ():表分组,其实就是一个子表达式。

字符类

  • .:除换行符外所有的字符;
  • \w:匹配字母、数字、下划线、汉字;(word)
  • \d:匹配一个数字(0 ~ 9);(digit)
  • \s:匹配任意的空白符;(space)
  • \b:匹配单词的开始或结束;(break)
  • []:匹配其中的字符集合,如 [aeiou] 就匹配任何一个英文元音字母、[a-z0-9A-Z_] 也完全等同于\w

反义类

  • \W:匹配任意不是字母,数字,下划线,汉字的字符;
  • \D:匹配任意非数字的字符;
  • \S:匹配任意不是空白符的字符;
  • \B:匹配不是单词开头或结束的位置;
  • [^x]:匹配除了 x 以外的任意字符;
  • [^aeiou]:匹配除了 aeiou 这几个字母以外的任意字符;

表重复(数量)

以下元字符表示指定在其「前面的内容」可以连续重复使用的次数,以使整个表达式得到匹配。

  • *:任意次(可能是 0 次);
  • ?:重复 0 次或 1 次;
  • +:至少出现 1 次;
  • {}:如 {5} 表示不多不少正好重复 5 次、{5,} 表示至少重复 5 次、{5,12} 表示重复的次数不能少于 5 次,不能多于 12 次(前后都闭);

分枝条件

指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开。

如:[a|b] 匹配 a 或者 b。

分组

():表分组,其实就是一个子表达式

使用小括号指定一个「子表达式」后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为 1,第二个为 2,以此类推。

  • (exp):匹配 exp 表达式,并捕获文本到自动命名的组(1,2,3…)里;
  • (?<name>exp):匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp); 如:(?<Word>\w+) (或者把尖括号换成 ' 也行:(?'Word'\w+)),这样就把 \w+ 的组名指定为 Word了。要反向引用这个分组捕获的内容,你可以使用 \k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b
  • (?:exp):匹配 exp,不捕获匹配的文本,也不给此分组分配组号;

零宽断言

  • (?=exp):匹配 exp 前面的位置; (?=exp) 也叫「零宽度正预测先行断言」,它断言自身出现的位置的后面能匹配表达式 exp。比如 \b\w+(?=ing\b),匹配以 ing 结尾的单词的前面部分(即除了 ing 以外的部分),如查找 I’m singing while you're dancing. 时,它会匹配 singdanc
  • (?<=exp):匹配 exp 后面的位置; (?<=exp) 也叫「零宽度正回顾后发断言」,它断言自身出现的位置的前面能匹配表达式 exp。比如 (?<=\bre)\w+\b 会匹配以 re 开头的单词的后半部分(即除了 re 以外的部分),例如在查找 reading a book 时,它匹配 ading

负向零宽断言

  • (?!exp):匹配后面跟的不是 exp 的位置;
  • (?<!exp):匹配前面不是 exp 的位置;

实战

  1. \ba\w*\b 表示匹配以字母 a 开头的单词:先是某个单词开始处 \b,然后是字母 a,然后是任意数量的字母、数字、下划线、汉字 \w*,最后是单词结束处 \b
  2. \(?0\d{2}[) -]?\d{8}:这个表达式可以匹配几种格式的电话号码,像 (010)88886666,或 022-22334455,或 02912345678 等。我们对它进行一些分析吧:首先是一个转义字符 \(,它能出现 0 次或 1 次(?),然后是一个 0,后面跟着 2 个数字(\d{2}),然后是 )- 或空格中的一个,它出现 1 次或不出现(?),最后是 8 个数字(\d{8})。

Regexper

Regexper 是一个用图形解释复杂正则的在线工具

下面是一个检测邮箱的正则表达式

\^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$\

邮箱正则表达式

数量图解

  • * 任意次:[abc]*

    *号任意次

  • ? 0 次或 1 次:[abc]?

    ?号零次或一次

  • + 至少 1 次:[abc]+

    +号至少一次

  • {x,y} 数量

    [abc]{1,2}

    [abc]{1,2}

    [abc]{1,99}

    [abc]{1,99}

    [abc]{2,99}

    [abc]{2,99}

参考资料

正则表达式30分钟入门教程

上次更新: 8/18/2019, 4:05:05 PM