正则表达式

Programming · 2022-04-14

什么是正则表达式

正则表达式(Regular Expression,简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式的性质

目的

对于给定的正则表达式和一串字符串,我们可以实现:

  • 判断给定的字符串是否符合正则表达式的过滤逻辑(称为“匹配)
  • 通过正则表达式,从该字符串中获取我们想要的特定部分

特点

  • 灵活性、逻辑性和功能性非常强;
  • 能够迅速地用极简单的方式达到对字符串的复杂控制;
  • 应用的对象是文本,因此具备普适性

正则表达式符号

正则表达式通常由一些普通字符(characters)和元字符(metacharacters)组成。前者包含数字和大小写字母,后者则具有特殊的含义。下表为常用元字符及其含义。

元字符描述
\将下一个字符标记为特殊字符、或原义字符、或向后引用、或八进制转义符。
如\匹配\,\n匹配换行符,\n匹配字符\n
^匹配输入字行首,匹配开始标记
$匹配输入行尾,匹配结束标记
*匹配前面的子表达式任意次,例如zo*匹配z及zo及zoo,等价于{0,}
+匹配前面的子表达式≥1次,例如zo+匹配zo及zoo,等价于{1,}
?匹配前面的子表达式≤1次,例如do(es)?匹配do或does,等价于{0,1}
{n}n为非负整数,匹配确定的n次,例如o{2}不能匹配Bob中的o,但能匹配food中的两个o
{n,}n为非负整数,至少匹配n次,例如o{2,}不能匹配Bob中的o,但能匹配fooood中的所有o
{n,m}n≤m,均为非负整数,至少匹配n次,最多匹配m次,例如o{1,3}能将fooooood中
前3个o为一组,后3个o为一组

案例

1.匹配邮箱格式,如test@wby.com

正确表达式:/\b[\w.%+-]+@[\w.-]+.[a-zA-Z]{2,6}\b/g

将其拆解成几个部分,解释如下:

  • \b[\w.%+-] \b表示单词边界,[]内包含的表示匹配多项,\w表示匹配字母、数字、下划线,.%+-即对应的四种字符
  • @[\w.-] @表示字符@,[]内包含的表示匹配多项,\w表示匹配字母、数字、下划线,.-即对应的字符
  • .[a-zA-Z]{2,6}\b .表示字符转义(匹配字符.),[]内包含的表示匹配多项,a-zA-z表示所有大小写字母,{2,6}表示最少匹配2次,最多匹配6次,\b表示单词边界
  • 其中,各部分间的+号表示至少匹配前面表达式一次,/.../g表示全域匹配

2.Django中的正则路由

某正则表达式:(?P\d{1,2})/(?P\w+)/(?P\d{1,2})

在正则表达式中,?P表示定义一个名为value的变量/数组,使得其满足该式子后面跟着的匹配条件,在这个案例中:

  • ?P\d{1,2}表示定义名为x的变量,符合条件:是一个一位或两位数
  • ?P\w+表示定义名为op的变量,符合条件:是一串字母、数字、下划线或其组合,+表示匹配至少一次
  • ?P\d{1,2}表示定义名为y的变量,符合条件:是一个一位或两位数