正则表达式:又称规则表达式,英文名为Regular Expression,
在代码中常简写为regex、regexp或RE
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
通俗理解:正则表达式是用于进行文本匹配的工具
- 简单的正则表达式
例:him,history,high,hi 在这个字符串中匹配出hi
正则表达式:hi
若要精确的匹配出hi,正则表达式:\bhi\b
\b是正则表达式规定的一个特殊代码,我们把它叫做元字符,单词的开头或结尾,也就是单词的分界处,它只匹配一个位置
- 元字符:
代码 | 说明 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配数字或字母或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
- 字符转义'\':如果你想查找元字符本身的话,
比如你查找.,或者*,就出现了问题:你没法指定它们,
因为它们会被解释成其它的意思。这时你就必须使用\来
取消这些字符的特殊意义。因此,你应该使用\.和\*。
当然,要查找\本身,你也得用\\.
- 常用的限定符(重复)
代码 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
- 反义
代码/语法 | 说明 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
- 字符类
要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在中括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)(英文语句通常只以这三个标点结束)。
我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字,同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
- 分组语法零宽断言
代码/语法 | 说明 |
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
例子:<img οnlοad="AutoResizeImage(100,100,this)"src="/Document/Title/Temp/2019-12-114bc5.png" >
- 匹配出:οnlοad="AutoResizeImage(100,100,this)"
正则表达式onload.+(?=src)
- 匹配出:2019-12-114bc5.png
正则表达式:(?<=Document/Title/Temp/).+(?=\")
- 贪婪与懒惰
贪婪:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符这被称为贪婪匹配。
懒惰:有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。
如果将前面给出的限定符转化为懒惰匹配模式,只要在它后面加上一个问号?
懒惰限定符:
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
- 注释
小括号的另一种用途是能过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。
要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉
(?<= | 断言要匹配的文本的前缀 |
<(\w+)> | 查找尖括号括起来的字母或数字(即HTML/XML标签) |
) | 前缀结束 |
.* | 匹配任意文本 |
(?= | 断言要匹配的文本的后缀 |
<\/\1> | 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签 |
) | 后缀结束 |