本文为 AI 研习社编译的技术博客,原标题 :
Regex tutorial — A quick cheatsheet by examples
翻译 | kerr、狒狒 校对 | 就2 整理 | 就2
原文链接:
https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285
正则表达式(regex 或 regexp)在文本信息提取方面是非常有用的工具,通过查询一个或多个特定搜索模式的匹配实现(例如,特定的ASCII或unicode字符序列)。
正则表达式的应用领域包括字符串语义分析/替换,到数据格式转换,以及网页抓取等。
最有趣的一点是,只要学过正则表达式的语法,在目前几乎所有编程语言中都可以应用正则表达式(JavaScript、Java、VB、C/C 、C#、Python、Perl、Ruby、Delphi、R、Tcl、以及其他很多语言),这些语言对一些高级功能和语法的支持只有细微的区别。
下面通过一些示例和解释来了解正则表达式。
Basic topics
Anchors — ^ and $
^The matches any string that starts with The -> Try it!end$ matches a string that ends with end
^The end$ exact string match (starts and ends with The end)
roar matches any string that has the text roar in it
数量词 —* ? and{}
abc* | 匹配ab后有零个或多个为c的字符串 |
abc | 匹配ab后有一个或多个为c的字符串 |
abc? | 匹配ab后有零个或一个为c的字符串 |
abc{2} | 匹配ab后有2个 c的字符串 |
abc{2,} | 匹配ab后有2个 c或更多个c的字符串 |
abc{2,5} | 匹配ab后跟2到5个c的字符串 |
a(bc)* | 匹配a后面跟零个或多个重复的bc序列的字符串 |
a(bc){2,5} | 匹配a后面跟2个到5个重复的bc序列的字符串 |
或运算符——|或
a(b|c) | 匹配a后跟b或c的字符串 - >试试吧! |
a[bc] | 同上一情况 |
字符类——\d \w \s和.
\d | 匹配一个数字字符 - >试试吧! |
\w | 匹配单词字符(字母、数字或下划线) - >试试吧! |
\s | 匹配空白字符(包括制表符和换行符) |
. | 匹配任意字符 - >试试吧! |
谨慎使用“.” 运算符,因为通常类或反义字符类(我们将在下面介绍)会更快更精确。
\ d,\ w和\ s也分别用\ D,\ W和\ S表示它们的否定。
例如,\ D将执行与\ d获得的相反匹配。
\D | 匹配一个非数字字符 - >试试吧! |
为了按字面意思理解,你必须使用反斜杠“\”来转义字符^.[$|* ?{\,因为它们具有特殊含义。
\$\d | 匹配一个数字前面有一个$的字符串 - >试试吧! |
请注意,您还可以匹配不可打印的字符,如制表符\ t,换行符\ n,回车符\ r。
标志位
基础部分中,如何构建一个正则表达式还有一个基本概念:标志。
正则表达式通常以这种形式/abc /出现,其中搜索模式由两个斜杠字符/分隔。
我们可以指定一个带有这些值的标志(我们也可以将它们相互组合):
g(全局)在第一次匹配后不返回,从上一次匹配结束时重新开始后续搜索
m(多行)启用时,^和$将匹配这行的开头和结尾,而不是整个字符串。
i(不敏感)使整个表达式不区分大小写(例如/ aBc / i将匹配AbC)。
中心主题
分组和捕获——
a(bc) | 括号创建一个值为bc的捕获组 - >试试吧! |
a(?:bc)* | 我们使用?:禁用捕获组 - >试试吧! |
a(? | 我们使用? |
当我们需要使用您首选的编程语言从字符串或数据中提取信息时,此运算符非常有用。由几个组捕获的任何多次出现都将以经典数组的形式公开:我们将使用匹配结果的索引来访问它们的值。
如果我们选择为组添加名称(使用(?
括号表达式——
[abc] | 匹配一个具有a或b或c的字符串 - >与a | b | c相同 - >试试吧! |
[a-c] | 同上一情况 |
[a-fA-F0-9] | 表示一个十六进制数字的字符串,不区分大小写 - >试试吧! |
[0-9]% | 在%符号之前具有0到9之间字符的字符串 |
[^a-zA-Z] | 一个没有字母从A到Z或从A到Z.的字符串,在这种情况下,^被用作表达式的否定->尝试它! |
请记住,在括号内的表达式中,所有特殊字符(包括反斜杠\)都会失去其特殊权力:因此我们不会应用“转义规则”。
贪婪与惰性匹配
量词(* {} )是贪婪的运算符,因此它们通过提供的文本尽可能地扩展匹配。
例如,
simple div
test中的simple div
。为了只捕获div标签,我们可以使用? 让它变得懒惰:
匹配内包含的任何一个或多个字符,根据需要进行扩展 - >试试吧!
请注意,更好的解决方案应该避免使用.来支持更严格的正则表达式:
] > | 匹配中包含的一次或多次除以外的任何字符 - >试试吧! |
高级主题
边界— \b and \B
\babc\b | 执行“仅限整个单词”搜索 - >尝试一下! |
\b表示像插入符号(它类似于$和^)的匹配位置,其中一侧是单词字符(如\w)而另一侧不是单词字符(例如,它可能是字符串的开头或者空格字符)。
它伴随着它的否定,\B。这匹配\b不匹配的所有位置,如果我们想要找到完全被单词字符包围的搜索模式,则可以匹配。
\Babc\B | 仅当图案完全被单词字符包围时才匹配 - >试试吧! |
回溯引用——\1
([abc])\1 | 使用\1,它与第一个捕获组匹配的相同文本匹配 - >试试吧! |
([abc])([de])\2\1 | 我们可以使用\ 2(\ 3,\ 4等)来识别与第二个(第三个,第四个等)捕获组匹配的相同文本 - >试试吧! |
(? | 我们把这个组命名为foo,稍后我们引用它(\ k |
先行和后行断言——(?=)和(?
d(?=r) | 仅在r之后匹配d,但r将不是整体正则表达式匹配的一部分->试试吧! |
(? | 仅在r之前匹配d,但r将不是整体正则表达式匹配的一部分->试试吧! |
你也可以使用否定运算符!
d(?!r) | 仅在不跟随r的情况下匹配d,但r将不是整体正则表达式匹配的一部分->尝试它! |
(? | 仅在没有r之前匹配d,但r将不是整体正则表达式匹配的一部分->尝试它! |
总结
正如您所看到的,正则表达式的应用程序字段可以是多个的,我确信您在开发人员职业生涯中看到的任务中至少识别出这些任务中的一个,这里是一个快速列表:
数据验证(例如检查时间字符串是否格式正确)
数据抓取(特别是网页抓取,最终按特定顺序查找包含特定单词集的所有页面)
数据转换(将数据从“原始”转换为另一种格式)
字符串解析(例如捕获所有URL的GET参数,捕获一组括号内的文本)
字符串替换(即使在使用通用IDE的代码会话期间,例如在相应的JSON对象中转换Java或C#类 - 将“;”替换为“,”将其设为小写,避免类型声明等)
语法高亮,文件重命名,数据包嗅探和许多其他涉及字符串的应用程序(其中数据不必是文本)
如果你喜欢的话,不要忘了推荐这篇文章。
不久我将出版一份包含常见正则表达式列表的新文章,敬请关注!雷锋网雷锋网雷锋网