某些字符
代码 | 说明 |
---|---|
\r | 换行 |
\n | 回车 |
\t | 制表符 |
常用的元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始(行的开始) |
$ | 匹配字符串的结束(行的结束) |
如果想匹配. or ^ or $
,需要在前面加上转义字符 \
,如\.
。
使用实例
文本 | 正则表达式 | 结果 |
---|---|---|
This is Jack | \bis\b | is |
This is Jack | \sis | is([空格]is) |
good good study | ^good | good(第一个) |
重复
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次(贪心) |
+ | 重复一次或更多次 (占有) |
? | 重复零次或一次 (懒惰) |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
- 贪婪(贪心) 如”*”字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的,
- 懒惰(勉强) 如 “?”懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。
- 占有如”+” 占有量词会覆盖事个目标字符串,然后尝试寻找匹配内容 ,但它只尝试一次,不会回溯,就好比先抓一把石头,然后从石头中挑出黄金
自定义指定范围
使用[]
指定范围,可以匹配[]
中任意字符。也可在[]
中使用 ^
符号,匹配除[]
之外的任意字符。
如:
[0-9]
效果与\d一致[ijk]
匹配i,j,k
分枝条件
使用 |
字符,类似于或,如 0\d{2}-\d{8}|0\d{3}-\d{7}
,将匹配满足 0\d{2}-\d{8}
或 0\d{3}-\d{7}
的字符,需要注意的是,匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
分组
使用()
进行分组,括号内的值作为子表达式,如:(1234){4}将会匹配到1234123412341234.
反义
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
反向引用 \1, \2…
表达式在匹配时,表达式引擎会将小括号 “( )” 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 “
\n 表示分组n,即第n个左括号(所包含的内容。
如:
源字符串:abcdaabcde
正则表达式:([ab])\1
[ab]将匹配字符a或b,当[]匹配到a时,\1==a,当[]匹配到b时,\1==b,此表达式将会匹配aa或bb。
也可使用?<name>
给分组命名,使用\k<name>
引用,\b(\w+)\b\s+\1\b
可写成\b(?<name>\w+)\b\s\k<name>\b
。
代码/语法 | 说明 |
---|---|
(exp) | 匹配exp,并捕获文本到自动命名的组里 |
(? |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp) |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |