写在前面
鉴于网上关于正则表达式的文章主次不明、可读性较差,本文快速、简要地整理了关于正则表达式的相关知识,适用于对正则表达式已有初步概念但对其具体使用缺乏了解的读者阅读,并介绍适当工具,使上述类型的读者能够快速上手。
概念和使用场景
- 正则表达式就是记录文本规则的代码。
- 可用于验证一段文本是否符合特定的规则。
- 可用于匹配(俗话:找到)一段复杂文本中符合某规则的部分,并将那部分取出或做替换等处理。
语法
各类字符
- 普通字符:直接输入的字母、数字、一部分标点符号、汉字等。普通字符严格地匹配字符串中的某一个字符。如:
a
严格匹配字符串中的“a”;abc
严格匹配字符串中的“abc”部分。 - 转义字符:以反斜杠
\
开头的字符。它们不再表示字符本身,而是被赋予了其他意义。 - 元字符:一部分转义字符和一部分标点符号。元字符非严格地匹配字符串中的某一个字符。如:
.
匹配字符串中的任意字符;a.b
匹配字符串中的“a?b”部分,其中 ? 为任意字符。详见下节。 - 限定符:默认情况下,一个普通字符、转义字符、元字符,只能匹配目标字符串中的一个字符,即一对一。而在上述三类字符之后加入限定符,可以使这种匹配变为一对多。详见下节。
概括地说,正则表达式就是把上述各类字符按语法规则搭配使用,使匹配不完全严格但又符合某种规律或规则,从而使字符串中满足条件的部分能够被灵活地检出。如果正则表达式是完全严格的,那就退化为 Ctrl+F 了。
下面按各类字符进行详细介绍。
普通字符
根据需要的格式直接写出(如abc
)。
常用元字符
代码/语法 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
根据需要的格式写出(如a.b
)。
常用限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
限定符可以不使用,此时相当于重复 1 次;若使用则需要写在被修饰的字符之后(如a.{3}b
)。
部分与整体
代码/语法 | 说明 |
---|---|
[chars] | 匹配 chars 中的字符之一 |
[5-9] | 匹配从 5 到 9 的字符之一;即匹配 5 或 6 或 7 或 8 或 9;等价于 [56789] |
[b-d1-3] | 匹配从 b 到 d 和从 1 到 3 的字符之一:即匹配 b 或 c 或 d 或 1 或 2 或 3; 等价于 [bcd123] |
(exp) | 将正则表达式或字符串 exp 看做一个整体 |
(exp1|exp2|…) | 匹配正则表达式或字符串 exp1、exp2、… 的其中之一 |
方括号或圆括号可被当做一个整体,其“地位”与一个字符等价,即若有限定符对其进行修饰时,修饰的是其整体(如a(bc|de)+
)。
常用反义词
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母、数字、下划线、汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
本质上是元字符。
常用模式修正符
-
贪婪模式
(待整理)见 https://www.cnblogs.com/liyuchao/p/12505938.html -
待补充
通常情况下,不使用模式修正符,也可以实现大多目标。
快速示例
下面介绍一些直观的、具有实际使用价值的示例。
匹配首尾特定格式的字符串
补充说明:
- 形如:aaa???bb。
- 其中 ??? 的长度固定为 3 位但内容不限。
分析:
- 3 个固定字符 a,加 3 个任意字符,加 2 个固定字符 b。
正则表达式:
- 入门:
aaa...bb
- 熟练:
aaa.{3}bb
(注:a{3}.{3}b{2}
也是正确的,但个人认为普通字符直接写出而不用限定符更加直观。)
验证十六进制数字
补充说明:
- 十六进制数字形如 1204,84BE2DCF,1c50a 等。长度不限。
- 应当注意的是,目的是验证,而不是匹配(俗话:找到),表示目标字符串中不应该有除了待测内容之外的内容,因此加入
^
和$
匹配字符串的首尾。
分析:
- 十六进制数字的每个数位可能出现 0-9,A-F,a-f(
[a-9A-Fa-f]
)。 - 长度不限隐含的意思是最少含有一位(
+
)。
正则表达式:^[0-9A-Fa-f]+$
验证十六进制数字(升级版)
补充说明:
- 基本要求同上例。但还要求:
- 仅能通过字母统一为大写或小写的值,如 1A2c 是不被接受的;
- 数值前不允许有多余的 0,如 013B 是不被接受的;
- 数字从低位向高位,每四位应该有一个空白字符,如 2 37B0、784 ab89 78ff 是可以被接受的。
分析:
- 先解决分段问题。假设目标字符串足够长(形如 784 AB89 ???? ???? 78FF),则其必可被分为 1 段长度为 0~4 的十六进制数(
[0-9A-Fa-f]{0,4}
),下称“头部”,和 0 ~无数(*
)段长度为 4 的十六进制数(([0-9A-Fa-f]{4})*
),下称“尾部”。这在目标字符串过短的情况下,也是成立的。 - 在每段之间可以存在一个空白字符。这样,将这个空白字符(
\s
)放在尾部的每段的前方((\s[0-9A-Fa-f]{4})*
;如果放在尾部的每段的后方,将导致字符串整体后面出现空白字符时也可被接受)。暂时合在一起即为^[0-9A-Fa-f]{0,4}(\s[0-9A-Fa-f]{4})*$
。 - 解决数值前不允许有多余的 0。分析一下,当数值不为 0 时,头部最多四位中的最高 1 位不能取 0,头部的后面的 0~3 位均可取 0;当数值为 0 时,仅有 1 位,且这个 0 必须存在。按这两种情况讨论(
(exp1|exp2)
)修改表达式,得到^([1-9A-Fa-f][0-9A-Fa-f]{0,3}(\s[0-9A-Fa-f]{4})*|0)$
。 - 为了避免混合使用大小写,将全部大写和全部小写拆成两种情况,和上述数值为 0 的情况一起讨论(
(exp1|exp2|exp3)
)即可。
正则表达式:^([1-9A-F][0-9A-F]{0,3}(\s[0-9A-F]{4})*|[1-9a-f][0-9a-f]{0,3}(\s[0-9a-f]{4})*|0)$
更多示例
待将来补充。
在 C# 中使用正则表达式
命名空间
using System.Text.RegularExpressions;
类
Regex
常用方法
// 指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项。
if (Regex.IsMatch(string input, string pattern))
{ ... }
// 在指定的输入字符串中搜索指定的正则表达式的第一个匹配项。
Match match = Regex.Match(string input, string pattern);
if (match.Success)
{
string matchedValue = match.Value;
matchedValue = ...
}
// 在指定的输入字符串中搜索指定的正则表达式的所有匹配项。
MatchCollection matches = Regex.Matches(string input, string pattern);
foreach (Match match in matches)
{
match.Value = ...
}
// 在指定的输入字符串内,使用指定的替换字符串替换与指定正则表达式匹配的所有字符串。
string output = Regex.Replace(string input, string pattern, string replacement);
// 在由正则表达式模式定义的位置将输入字符串拆分为一个子字符串数组。
string[] outputs = Regex.Split(string input, string pattern);
辅助工具
- Regex-vis
https://regex-vis.com/
- 可视化编辑,非常直观地观察和修改正则表达式每部分;这一点对于较为复杂的正则表达式尤其好用;
- 可批量测试字符串,但对于每个字符串,只能显示整体是否匹配(适用于检测小型字符串是否满足规定的格式的情形),不能显示正则表达式中的哪部分匹配了字符串中的哪部分。
- 网页版,访问方便;内置分享按钮,便于把正则表达式包括测试字符串分享给别人或以永久链接的形式自行留存。
- 本地工具 Match Tracer
http://www.regexlab.com/zh/mtracer/
- 能够以 TreeView 的形式树状地、拆解地显示正则表达式的每部分;
- 可以显示正则表达式中的哪部分匹配了字符串中的哪部分;
- 可以逐一地或批量地显示较长的待测字符串中的所有匹配部分,而不只是整体是否能够满足匹配条件(适用于从长段字符串中取出特定字符串的情形,如网络爬虫从网页源代码中取所有符合格式的关键字);
- (待研究)似乎不支持批量测试,一次只能测试一个字符串(对大量小型字符串的调试比较麻烦);
- 需要安装,仅有 Windows 版。
- 各类站长工具
- 主要是有些预制的正则表达式可供直接使用;
- 质量良莠不齐,有些可能有错误。
- 其他工具:待补充