元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
- 例子
\ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b) - 注意事项
如果你想查找元字符本身的话,得使用转义符“\”
例如:deerchao.net匹配deerchao.net,C:\Windows匹配C:\Windows。
限定符
代码 | 说明 |
---|---|
* | 重复0次或多次 |
+ | 重复1次或多次 |
? | 重复0次或1次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
- 例子
Windows\d+匹配Windows后面跟1个或更多数字
^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)
字符组
代码 | 说明 |
---|---|
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。 |
分支条件
“|”是分支条件,使用“|”可以把不同的表达式分割,只要匹配到其中任意一个即可,匹配是从左到右匹配的,只要匹配到一个就不往下匹配了。
- 例子
众所周知IP地址每一位都不能大于255,在写匹配IP地址的正则表达式时,首先需要解决的是如何匹配0到255之间的数字!
\b(25[0-5]|2[0-4]\d|[1]\d{2}|[1-9]\d?)\b
分组
-
用小括号来指定的字表达式都叫做分组。然后可以指定这个字表达式的重复次数,或者其他操作。
-
规则:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
-
例子
匹配完整的IP
\b((25[0-5]|2[0-4]\d|[1]\d{2}|[1-9]\d?).){3}(25[0-5]|2[0-4]\d|[1]\d{2}|[1-9]\d?)\b
反义
代码 | 说明 |
---|---|
\W | 匹配任意不是字母、数字、下划线汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意不是数字的字符 |
\B | 匹配不是单词边界的字符 |
[^x] | 匹配任意不是x的字符 |
[^xyz] | 匹配除了xyz这几个字母外的任意字符 |
- 例子
\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串。
贪婪与懒惰
贪婪
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab,而不能匹配到aab,这被称为贪婪匹配。
- 例子
aabab匹配aab
懒惰
虽然正则是贪婪的,但有时我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
- 例子
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)
零宽断言
分类 | 代码/语法 | 说明 | 例子 |
---|---|---|---|
零宽断言 | (?=exp) | 匹配exp前面的位置 | I like singing and swimming. 中去匹配sing、 swim \b\w(?=ing)* |
零宽断言 | (?<=exp) | 匹配exp后面的位置 | swiming and swimming. 中去匹配swim 后面单词 (?<=swim)\w+\b |
负向零宽断言 | (?!exp) | 匹配后面跟的不是exp的位置 | 匹配三位数字,而且三位数字后面不是数字: 123a 1234 \b\d{3}(?!\d)\w+\b |
负向零宽断言 | (?<!exp) | 匹配前面不是exp的位置 | 匹配前面不是小写字母的七位数组: s1234567 1234567 \b(?<![a-z])\d{7}\b |
查找替换,使用$符号
查找表达式: 第([一二三四五六七八九十百零〇]+|[0-9]+)章(.+)\s
替换为表达式:##第$1章$2\r
常用匹配
- 匹配中文: [\x{4e00}-\x{9fa5}]
- email: \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}
- 空白行: \s
- 网址: <![CDATA[** ^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+ **]]>
- 手机国内:0?(13|14|15|18|17)[0-9]{9}
- 电话号码国内:[0-9-()()]{7,18}
- IP:((25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d).){3}(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)
- 身份证:\d{17}[\d|x]|\d{15}