正则表达式
2024/2/16大约 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 次。
