sed
——Unix的“流编辑器”实用程序,允许强大的文本文件转换。-E
——使用扩展的Regex模式匹配-i
——原位替换文件流's/^(.*?s|)
——将行的开头包装在捕获组中[^@]+@[^s]+
——电子邮件Regex的简化版本。/1{redacted}/g'
——用{redacted}
替换每个电子邮件地址。test.txt
——对test.txt
文件执行操作。
我们可以在一个示例test.txt
文件上运行上面的替换命令。
My email is patrick.triest@gmail.com
命令运行后,电子邮件将从test.txt
文件中进行编辑。
My email is {redacted}
警告——此命令将自动从你传递的任何test.txt
中删除所有电子邮件地址,因此,在运行它的时候要小心,因为此操作无法逆转。要在终端中预览结果,而不是替换原来的文本,只需省略-i
标志。
注意——尽管上述命令适用于大多数Linux发行版,但是macOS使用BSD实现是sed
,它在其支持的Regex语法中受到更多的限制。要在MacOS上使用sed
,并具有体面的正则表达式支持,我建议使用brew install gnu-sed
安装sed
的GNU实现,然后从命令行使用gsed
而不是sed
。
8 – 什么时候不使用Regex
好的,知道Regex是一个强大又灵活的工具了吧?!那么,有没有应该避免编写Regex的时候?有!
8.0 – 语言解析
解析结构化语言,从英语到Java到JSON,使用正则表达式都是一种真正的痛苦。
当数据源中的边缘情况或次要语法错误导致表达式失败时,将导致最终(或即时)的灾难,出于此目的去编写你自己的正则表达式可能会让你心情沮丧。
强化的解析器几乎可用于所有机器可读的语言,而NLP工具可用于人类语言——我强烈建议你使用其中一种,而不是尝试编写自己的语言。
8.1 – 安全 – 输入过滤和黑名单
使用Regex过滤用户输入(例如来自Web表单),以及防止黑客向应用程序发送恶意命令(例如SQL注入),看上去似乎很诱人。
在这里使用自定义的Regex是不明智的,因为它很难覆盖每个潜在的攻击向量或恶意命令。例如,黑客可以使用替代字符编码绕过编写得不全面的输入黑名单过滤器。
这是另一个实例,对此我强烈建议你使用经过良好测试的库和/或服务,以及使用白名单而不是黑名单,以保护你的应用程序免受恶意输入。
8.2 – 性能密集的应用程序
正则表达式的匹配速度可以从不是非常快到极慢的范围变动,取决于表达式写得怎么样。对于大多数用例来说,这很好,特别是如果匹配的文本很短(例如电子邮件地址表单)的话。然而,对于高性能服务器应用程序,正则表达式会成为性能瓶颈,特别是如果表达式写得不好或被搜索的文本很长的话。
8.3 – 对于不需要Regex的地方
正则表达式是一个非常有用的工具,但这并不意味着你应该在任何地方使用它。
如果问题有替代的解决方案,解决方案更简单和/或不需要使用Regex,那么请不要只是为了显摆而使用Regex。Regex很棒,但它也是最不可读的编程工具之一,而且很容易出现边缘情况和bug。
过度使用Regex会让你的同事(以及需要工作在你的代码上的任何人)生气恼怒,甚至恨不得揍你一顿。
结论
我希望这是对Regex的许多用途的一个有用的介绍。
还有很多Regex的用例是我们没有涵盖的。例如,可以在PostgreSQL查询中使用Regex来动态地搜索数据库中的文本模式。
我们还漏下了许多强大的Regex语法特性没有覆盖,如lookahead,lookbehind,atomic groups,recursion和subroutines。
要提高正则表达式技能并了解有关这些功能的更多信息,我推荐以下资源。
- Learn Regex The Easy Way - https://github.com/zeeshanu/learn-regex
- Regex101 - https://regex101.com/
- HackerRank Regex Course - https://www.hackerrank.com/domains/regex/re-introduction
本教程中示例的源代码可以在Github存储库中找到—— https://github.com/triestpa/You-Should-Learn-Regex
欢迎随时对本教程提出任何建议、看法或批评。
优质内容筛选与推荐>>
1、正则表达式实现6-10位密码由数字和字母混合组成2、数据结构与算法(C++版本)-链表3、浅析一致性事实4、长度12的数组,要求对数据分为3组,每组数据对应位置的数字为前几位的和,并返回12位数组5、Java基础—方法与引用数据类型