- 情景引入
- 改代码
- 查找文件
- 词法分析器
- 网站注册密码
- 信息爬取
- 简介
- 在线测试工具
- Regulex
- RegExr
- 语法
- 普通字符
- 非打印字符
- 特殊字符
- 限定符
- 定位符
- 修饰符
- 元字符
- 实例
- 匹配邮箱
情景引入
改代码
修改代码格式问题,或者重命名代码里的某个变量等,都可以使用 VS Code 自带的搜索框中的 RE。熟练的掌握正则表达式,能够帮助程序员以最快的速度写出最优雅的代码。
查找文件
可以使用 ? 和 * 通配符来查找硬盘上的文件,这是简单的通配符。
- ? 通配符匹配文件名中的 0 个或 1 个字符;
- 而 * 通配符匹配零个或多个字符。
像 *api
这样的模式将查找下列文件:
RE 功能更强大,而且更加灵活。
词法分析器
编译器中的词法分析器,会使用 RE 去匹配代码中的关键字。
网站注册密码
网站上的注册表单会用到 RE 去判断密码的复杂程度。
信息爬取
在爬虫中,同样可以用 RE 去提取需要的信息。
简介
- 正则表达式(Regular Expression)是一种用于 匹配 或 替换字符串中的特定模式 的语言,可以把它当作通配符的增强版,它可以用元字符、量词、分组、断言等来表示复杂的规则。
- 正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
- 正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。
下面先给出一个简单的示例:
^[0-9]+abc$
- ^ 为匹配输入字符串的开始位置。
- [0-9]+ 匹配多个数字:[0-9] 匹配单个数字,+ 匹配一个或者多个。
- abc$ 匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。
我们在写用户注册表单时,只允许用户名包含字符、数字、下划线和连接字符 -
,并设置用户名的长度,我们就可以使用以下正则表达式来设定:
在线测试工具
Regulex
正则表达式在线测试工具:https://regex101.com/
RegExr
正则表达式在线测试工具:https://regexr.com/
语法
构造正则表达式的方法和创建数学表达式的方法一样,用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。
普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符,这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
字符 | 描述 |
---|---|
[ABC] | 匹配 […] 中的所有字符,例如 [ae] 匹配字符串 “You are my angle.” 中所有的 a e 字母。 |
[^ABC] | 匹配除了 […] 中字符的所有字符,例如 [^ae] 匹配字符串 “You are my angle.” 中除了 a e 字母的所有字母。 |
[A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
. | 匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]。 |
[\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。 |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
非打印字符
非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
特殊字符
所谓特殊字符,就是一些有特殊含义的字符。
- 如 “
baby*baby
” 中的 * ,简单的说就是表示任何字符串的意思。 - 如果要查找字符串中的
*
符号,则需要对*
进行转义,即在其前加一个\
,baby\*baby
匹配字符串baby*baby
。
若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\
放在它们前面。
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 、 + 、 ? 、 {n} 、 {n,} 、 {n,m} 共6种。
限定符 | |
---|---|
* | 匹配前面的子表达式零次或多次 。例如,ab* 能匹配 “a” 以及 “abb”。* 等价于 {0,}。 |
+ | 匹配前面的子表达式一次或多次 。例如,ab+ 能匹配 “ab” 以及 “abb”,但不能匹配 “a”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次 。例如,do(es)? 可以匹配 “do” 、 “does”、 “dog” 中的 “do” 和 “does”。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次 。例如,o{2} 表示匹配2个 o,不能匹配 “Bob” 中的 o,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配 n 次 。例如,o{2,} 不能匹配 “Bob” 中的 o,但能匹配 “foooood” 中的所有 o。o{1,} 等价于 o+ 。o{0,} 则等价于 o* 。 |
{n,m} | m 和 n 均为非负整数,其中 n <= m 。最少匹配 n 次且最多匹配 m 次 。例如,o{1,3} 将匹配 “fooooood” 中的前三个 o。o{0,1} 等价于 o? 。请注意在逗号和两个数之间不能有空格。 |
以下正则表达式匹配一个正整数,[1-9]
设置第一个数字不是 0,[0-9]*
表示任意多个数字:
/[1-9][0-9]*/
- 请注意,限定符出现在范围表达式
[0-9]
之后。因此,它应用于整个范围表达式,在本例中,只指定从 0 到 9 的数字(包括 0 和 9)。 - 这里不使用 + 限定符,因为在第二个位置或后面的位置不一定需要有一个数字。
- 也不使用 ? 字符,因为使用 ? 会将整数限制到只有两位数。
* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
贪婪:下面的表达式匹配从开始小于符号 (<) 到关闭 h1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
非贪婪:如果只需要匹配开始和结束 h1 标签,下面的非贪婪表达式只匹配 <h1>
。
/<.*?>/
定位符
定位符用来描述字符串或单词的边界, ^ 和 $ 分别指字符串的开始与结束, \b 描述单词的前或后边界, \B 表示非单词边界。
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^*
之类的表达式。
修饰符
标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外,格式如下:
/pattern/flags
- g 修饰符
查找字符串中所有的匹配项:
- i 修饰符
不区分大小写匹配:
- m 修饰符
使 ^ 和 $ 匹配一段文本中每行的开始和结束位置, g 只匹配第一行,添加 m 之后实现多行。
- s 修饰符
默认情况下的圆点 . 是 匹配除换行符\n
之外的任何字符,加上 s 之后, . 中包含换行符\n
。
元字符
元字符的完整列表:元字符 - 完整列表
实例
匹配邮箱
测试如下图:
参考:
- 10分钟快速掌握正则表达式
- runoob 正则表达式 - 教程