正则表达式
大约 4 分钟
正则表达式
是什么
正则表达式(regular expressions),简称 regex,或 regexp,用于搜索或匹配字符串中符合某个模式的文本。
regex 在不同的编程语言下有不同的呈现形式,但是总体语法规则是不变的。
学习
基本规则
限定符
符号 | 含义 |
---|---|
? | ? 前面的一个字符需要出现 0 次或者 1 次,即:可有可无 |
* | * 前面的一个字符需要出现 0 次或者多次,即:可以没有也可以很多 |
+ | + 前面的一个字符需要出现 1 次或者多次,即:必须出现一次 |
| | 或运算,需要用括号标明作用范围,如a (cat|dog) 表明匹配a cat 或a dog 如果是 a cat | dog ,那就是匹配a cat 或 dog |
(<str>)<sym> | 在限定符之前加上括号,可以扩大该限定符限定的字符范围 如: (ab)+ 就代表ab 出现一次或多次 |
<str>{<num>} | 字符后加{<num>} 可以规定出现次数,如a{6} 表示a 只能出现 6 次花括号内可输入出现次数的范围,用逗号区分范围上下限,如: a{2,6} 表示a 出现 2-6 次 |
字符类
符号 | 含义 |
---|---|
[<str>] | 方括号内的内容代表要求匹配的字符只能取自它们 |
[^<str>] | 方括号内的内容代表要求匹配的字符不能取自它们 |
[0-9] | 指定数字范围 |
[a-z] | 指定小写字母范围 |
[A-Z] | 指定大写字母范围 |
[0-9a-zA-Z] | 方括号内允许嵌套,左式表示必须出现数字或小写字母或大写字母 |
元字符
他的出现是为了通过转义,来表达一些不方便表达的字符,如空白符、换行符等,可与字符类搭配使用。
符号 | 含义 |
---|---|
\d | 数字字符 |
\w | 单词字符(英文、数字及下划线) |
\s | 空白符(包含 tab 和换行符) |
\b | 表示单词字符的边界 |
\D | 非数字字符 |
\W | 非单词字符 |
\S | 非空白符 |
. | 任意字符(但是不包含换行符) |
^ | 匹配行首,如^a 只会匹配行首的a |
$ | 匹配行尾,如a$ 只会匹配行尾的a |
贪婪与懒惰匹配
贪婪匹配
贪婪匹配指的是限定符对字符的选择会尽可能多地选择。
懒惰匹配
懒惰匹配指的是限定符对字符的选择会尽可能少地选择。
如在这样的一个字符串中:
<span><b>This is a sample text</b></span>
如果我们把正则表达式写作:<.*>
,即:匹配出现在尖括号内的任意字符串,但是正则表达式默认是贪婪匹配,所以它会尽可能多地选择,即匹配为:<span><b>This is a sample text</b></span>
但是如果写作<.*?>
,则会采用懒惰匹配,即:尽可能少地选择,匹配为:<span>
<b>
</b>
</span>
实例
匹配 RGB 颜色值
RGB 颜色值特点:以#
开头,后面跟着 6 个十六进制字符。
应该匹配为:#[a-fA-F0-9]{6}\b
加入
\b
是为了防止例如#fffffffff
这样的字符也被匹配到,他的确有 6 个十六进制字符,但是它后面还有fff
,不符合要求。
匹配 IP 地址
IP 地址特点:由四个数字组成,每个数字的范围是0-255
,每个数字之间用.
分隔。
应该匹配为:((25[0-5]|2[0-4]\d|[01]?\d\d?)(\.|$)){4}
- 其中
25[0-5]|2[0-4]\d|[01]?\d\d?
,匹配了0-255
之间的数字,具体思路是分不同情况来匹配,如果百位和十位已经为25
了,那剩下的个位只能取 0-5;如果百位是 2,十位是 4,则个位在 0-9 都符合要求,但是如果百位是 0 或 1,则十位和个位无论怎么取都符合要求。 \.|$
,匹配了.
或者字符串的末尾。{4}
规定了要匹配 4 次。