测试正则表达式网站: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这几个字母以外的任意字符 |
后向引用
| 代码/语法 | 说明 |
|---|---|
| (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次以上,但尽可能少重复 |正则表达式同时有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权