测试正则表达式网站:https://regex101.com/

用途

查找符合某些复杂规则的字符串的的工具。主要是查找。

元字符

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
( 用小括号来指定子表达式
) 用小括号来指定子表达式

把匹配理解成光标移动的位置就行

  • 对于元字符本身的搜索可以使用转义字符来取消字符的特殊意义,如\\\d

  • 同时使用^和$可以限定整个字符串的内容,如^\d{3,5}$,则限定字符串只能包含3到5连续位数字

重复

代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

如: ^\w+匹配一行的第一个单词

字符类

要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?

很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。

下面是一个更复杂的表达式:(?0\d{2}[) -]?\d{8}。

这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。

“(” 和 “)”也是元字符,所以在这里需要使用转义

分枝条件

这部分内容来自正则表达式30分钟入门教程中的分枝条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。但匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了,所以要注意顺序。

  • 0\d{2}-\d{8}|0\d{3}-\d{7}可以匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)

  • \(0\d{2})[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。

\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。

分组

可以用( )将一部分字符匹配规则括起来成为子表达式。

  • 应用:
    • 可以将多个字符使用重复规则,如(\d{1,3}.){3} ,将 xxx. (这里x表示任意数字)重复三次

反义

反义代码基本上是将元字符中的特殊字符大写化表示反义,但有个例外可以用[^ ]来排除指定的字符匹配

代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
x 匹配除了x以外的任意字符
aeiou 匹配除了aeiou这几个字母以外的任意字符

]+>匹配用尖括号括起来的以a开头的字符串。

后向引用

代码/语法 说明
(exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

\k 命名后向引用。

如(?\w)\k

贪婪与懒惰

贪婪字符:.* (尽可能匹配多的字符)

  • 懒惰限定符

    | 代码/语法 | 说明 |
    | ——————- | ———————————————- |
    | *? | 重复任意次,但尽可能少重复 |
    | +? | 重复1次或更多次,但尽可能少重复 |
    | ?? | 重复0次或1次,但尽可能少重复 |
    | {n,m}? | 重复n到m次,但尽可能少重复 |
    | {n,}? | 重复n次以上,但尽可能少重复 |

    正则表达式同时有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权