常用的正则表达式总结
2019-12-14 本文已影响0人
数据蝉
一、正则表达式概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。
二、正则表达式的特点
- 灵活性、逻辑性和功能性非常强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
- 对于刚接触的人来说,比较晦涩难懂。
三、正则表达式的目的
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作"匹配"):
- 可以通过正则表达式,从字符串中获取我们想要的特定部分。
四、正则表达式的语法
要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。
语法 | 说明 | 表达式实例 | 完整匹配的字符串 |
---|---|---|---|
字符 | |||
一般字符 | 匹配自身 | abc | abc |
. | 匹配任意除换行符“\n”外的字符。在DOTALL模式中也能匹配换行符 | a.c | abc |
\ | 转义字符,使后一个字符改变原来的意思。如果字符串中有字符 * 需要匹配,可以使用*或者字符集[ * ]。 | a\.c a\\c | a.c a\c |
[...] | 字符集(字符类)。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围。如[abc]或[a-c]。第一个字符如果是^则表示取反,如[^abc]表示不是abc的其他字符。所有的特殊字符在字符集中都失去其原有的特殊含义。在字符集中如果要使用]、-或^,可以在前面加上反斜杠,或把]、-放在第一个字符,把^放在非第一个字符。 | a[bcd]e | abe ace ade |
预定义字符集(可以写在字符集[...]中 | |||
\d | 数字:[0-9] | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\Sc | abc |
\w | 单词字符:[A-Za-z0-9_] | a\wc | abc |
\W | 非单词字符:[^\w] | a\Wc | a c |
数量词(用在字符或(...)之后) | |||
* | 匹配前一个字符0或无限次。 | abc* | ab abccc |
+ | 匹配前一个字符1次或无限次。 | abc+ | abc abccc |
? | 匹配前一个字符0次或1次。 | abc? | ab abc |
{m} | 匹配前一个字符m次。 | ab{2}c | abbc |
{m,n} | 匹配前一个字符m至n次。m和n可以省略:若省略m,则匹配0至n次;若省略n,则匹配m至无限次。 | ab{1,2}c | abc abbc |
* ?+???{m,n}? | 使* + ?{m,n}变成非贪婪模式 | ||
边界匹配(不消耗待批匹配字符串中的字符) | |||
^ | 匹配字符串开头。在多行模式中匹配每一行的开头。 | ^abc | abc |
$ | 匹配字符串末尾。在多行模式中匹配每一行的末尾。 | abc$ | abc |
\A | 仅匹配字符串开头。 | \Aabc | abc |
\Z | 仅匹配字符串末尾。 | abc\Z | abc |
\b | 匹配\w和\W之间 | a\b!bc | a!bc |
\B | [^\b] | a\Bbc | abc |
逻辑、分组 | |||
| | 代表左右表达式任意匹配一个。它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。如果|没有被包含在()中,则它的范围是整个正则表达式。 | abc|def | abc def |
(...) | 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号'(',编号+1。另外,分组表达式作为一个整体,可以后接数量词。表达式中的|在该组中有效。 | (abc){2}a(123|456)c | abcabca456c |
(?P<name>...) | 分组,除了原有的编号外再指定一个额外的别名。 | (?P<id>abc){2} | abcabc |
<number> | 引用编号为<number>的分组匹配到的字符串。 | (\d)abc\1 | 1abc1 5abc5 |
(?P=name) | 引用别名为<name>的分组匹配到的字符串。 | (?P<id>\d)abc(?P=id) | 1abc1 5abc5 |
特殊构造(不作为分组) | |||
(?:...) | (...)的不分组版本,用于使用'|'或后接数量词。 | (?:abc){2} | abcabc |
(?iLmsux) | iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个。 | (?i)abc | AbC |
(?#...) | #后的内容将作为注释被忽略。 | abc(?#comment)123 | abc123 |
(?=...) | 之后的字符串内容需要匹配表达式才能成功匹配。不消耗字符串内容。 | a(?=\d) | 后面是数字的a |
(?!...) | 之后的字符串内容需要不匹配表达式才能成功匹配。不消耗字符串内容。 | a(?!=\d) | 后面不是数字的a |
(?<=...)之前的字符串内容需要匹配表达式才能成功匹配。不消耗字符串内容。 | (?<=\d)a | 前面是数字的a | 前面是数字的a |
(?<!...) | 之前的字符串内容需要不匹配表达式才能成功匹配。不消耗字符串内容。 | (?<!\d)a | 前面不是数字的a |
(?(id/name)yes-pattern|no-pattern) | 如果编号为id/别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern。|no-pattern可以省略。 | (\d)abc(?(1)\d | abc) |