正则表达式
EG
\bhi\b
:hi
\bhi\b.\Lucy
: hi Lucy
\bhi\b.*\bLucy\b
:hi af...dsa Lucy
0\d\d-\d\d\d\d\d == 0\d{2}-\d{5}
:088-12345
元字符
代码 | 说明 |
---|---|
. | 匹配除换行符意外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 包括空格、换行符等 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
注意:
^和&都匹配的是一个位置
作用:^\d{5,12}和\d{5,12}的区别:
^\d{5,12}:表示整个字符串只能是5--12个相连数字组成 eq:123456789
\d{5,12} : 表示整个字符串只要包含5--12个相连数字就可以 eg:asd123456fhg
字符类
指定匹配集合
- 在[]中列出 如下,查找[]中列出的所有字符
eg:[aeiou] [.?!&] [12398] - 范围
eg: [1-9] : 查找一位数字
[a-z0-9A-z] : 查找所有字符
分支条件
EG:(?0\d{2}[) -]?\d{8}
可以匹配如(010)12345678或022-12345678等
但也会匹配(012-12345678或010)12345678等
"|"
-
(0\d{2})[- ]?\d{8}|0\d{2}[- ]?\d{8}
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔 -
\d{5}-\d{4}|\d{5} 匹配5位数字 或者5位-4位的数字(12345 / 12345-1234)
-
注意:使用分枝条件时,要注意各个条件的顺序
| 分枝条件,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了
重复控制
代码 | 说明 |
---|---|
* | 重复0次及以上 |
+ | 重复1次及以上 |
? | 重复0次或1次 |
重复n次 | |
重复n次及以上 | |
重复n到m次 |
反义
代码 | 说明 |
---|---|
\W | 匹配任意不是字母、数字、下划线、汉字的字符 |
\S | 匹配任意不是空白的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aei] | 匹配除了aei这几个字母以外的任意字符 |
eg:
<a[^>]+>匹配用<>括号括起来的以a开头的字符串
分组
"()"
我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);
但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。
- eg:(\d{1,3}.){3}\d{1,3}
\d{1,3}匹 配1到3位的数字,(\d{1,3}.){3}匹 配三位数字加上一个英文句号(这个整体也就是这个分组)重 复3次,最后再加上一个一到三位的数字(\d{1,3})。
默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括 号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
呃……其实,组号分配还不像我刚说得那么简单:
- 分组0对应整个正则表达式
- 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组 号
- 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.
向后引用
向后引用用于重复搜索前面某个分组匹配的问题,例如,\1代表分组1匹配的文本
-
eg:
\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty
这个表达式首先是一个单词, 也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b), 这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。 -
你也可以自己指定子表达式的组名。
要指定一个子表达式的组名,请使用这样的语法:
1.(?\w+)(或者把尖括号换成'也行
2.(?'Word'\w+)),这样就把\w+的 组名指定为Word了。要反向引用这个分组捕获的 内容,你可以使用\k,所以上一个例子也可以写成这样:\b(? \w+)\b\s+\k \b。
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
'' | (? |
匹配exp,并捕获文本到名称为name的组里,也可以写成 (?'name'exp) |
'' | (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
'' | (?<=exp) | 匹配exp后面的位置 |
'' | (?!exp) | 匹配后面跟的不是exp的位置 |
'' | (?<!exp) | 匹配前面不是exp的位置 |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅 读 |