你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

如何用正则表达式在多种语言中搜索文本文件?简单操作看这里

发布时间:2025-06-21

浏览次数:0

很简单,不是吗?

我们可以用\d替换,结果相同(匹配所有数字)。

这种表达式的卓越之处在于,它经过少量调整后,便能在多种编程语言中得到应用。

为了展示目的,我们首先简要掌握如何运用这16种广受欢迎的编程语言对文本文件进行基础的正则表达式搜索操作。

我们使用以下输入文件(test.txt)为例。

图片

每个脚本都会应用该正则表达式对test.txt文件进行读取和查找,随后将找到的(如'1234'、'5362'、'1'等)信息输出至控制台。

语言范例0.0 – / Node.js /

图片

0.1 –

图片

0.2 – R

图片

0.3 – Ruby

图片

0.4 –

图片

0.5 – Perl

图片

0.6 – PHP

图片

0.7 – Go

图片

0.8 – Java

图片

0.9 –

图片

0.10 – Scala

图片

0.11 – Swift

图片

0.12 – Rust

图片

0.13 – C#

图片

0.14 – C++

图片

0.15 – Bash

将相同操作用十六种语言进行编写是一项颇具趣味性的实践,然而在本教程中,我们主要将采用其中几种(以及最后会涉及一点Bash),因为这些语言(依我之见)往往能带来更为清晰且易于阅读的代码实现。

1 – 年份匹配

让我们来观察一个更为直观的案例——挑选二十世纪或二十一世纪中的任何一年作为有效年份。

我们选择使用\b符号而非^和$来界定正则表达式的起始与结束。这里的\b代表单词边界,亦即两个单词间的空白。这样的设置使得我们能够在文本段落而非代码行中准确匹配年份,这对于段落文本的搜索尤为实用。

请注意,反斜杠b与反斜杠s存在区别,反斜杠s用于查找空格字符的代码。反斜杠b则用于搜索一个单词字符周围没有其他字符的位置,这有助于找到单词字符的空缺部分。而反斜杠s则专门用于搜索空格字符。反斜杠b特别适合于我们希望精确匹配特定序列或单词,而不关心这些序列或单词前后是否包含空格的情况。

1.0 – 真实示例 – 计数年份

在脚本编写过程中,我们可以利用该表达式来检索维基百科历史记录中,提及20世纪或21世纪年份的频次。

图片

上述脚本将按照提及的次数依次打印年份。

图片

2 – 匹配时间

我们需要创建一个正则表达式,其目的是识别并匹配以24小时制表示的时间,例如16时59分这样的格式。

此处引入了一个新的标识方法,即通过\2来识别第二个括号内的内容,这指的是分隔符,可能是斜杠(/)或连字符(-)。这样的做法确保了在模式匹配过程中,分隔符的一致性得到保持,即若第一个分隔符为斜杠,第二个也必须采用斜杠。

3.0 – 捕获组替换

通过使用捕获组,我们可以动态地重组和转换我们的字符串输入。

确定引用捕获组的标准操作涉及运用美元符号或反斜杠符号,同时需注明捕获组的编号(需留意捕获组所包含的是整个捕获的文本内容)。

3.1 – 真实示例 – 日期格式转换

若我们的使命是将遵循国际日期格式(日/月/年)的文档群组,转换成采用美式日期格式(月/日/年)的样式。

我们可以采用模式32124或32124来替换,并运用上述的正则表达式。

让我们分解捕捉组。

替换模式通过简单调换,将表达式中月份与日期的位置进行了互换。

以下是我们如何在中进行这种转换:

图片

该脚本会在控制台输出“今日日期为09/18/2017”的信息。

同样的脚本在中是这样的:

图片

4 – 电子邮件验证

正则表达式也可用于输入验证。

以上是一个(过于简单的)Regex,用来匹配电子邮件地址。

4.0 – 真实示例 – 验证电子邮件

若需构建一个用于验证电子邮件地址有效性的基础函数。

此脚本的输出应为

请注意——在现实的应用场景中,仅依靠正则表达式来验证电子邮件地址在很多情况下,比如用户注册环节,是远远不够的。然而,一旦你确认所输入的文本确实是一个电子邮件地址,那么你就应当严格遵循发送确认或激活邮件的标准流程。

4.1 – 完整的电子邮件Regex

这仅仅是一个极其基础的示例,却遗漏了众多关键的电子邮件有效性边界条件,比如无效的开头或结尾字符,以及连续出现的点号。我强烈不推荐在您的应用中采用那个表达式;更佳的选择是采用一个信誉良好的电子邮件验证库,或者深入挖掘更全面的电子邮件验证正则表达式。

这是一个源自.com的高级表达式,能够识别出99%与RFC 5322标准相吻合的电子邮箱地址。

图片

不过今天我们不打算深入探讨。

5 – 代码注释模式匹配

Regex的强大之处之一在于其能充当代码重构的工具。众多代码编辑器均能实现基于Regex的搜索与替换功能。一个格式恰当的Regex替换操作,能将耗时半小时的繁琐工作,巧妙地转化为一场令人赏心悦目的Regex重构魔术。

请手动进行这些操作,而非编写脚本程序来完成。大多数文本编辑器都具备利用正则表达式进行搜索与替换的功能。

以下是一些受欢迎的编辑器指南。

在进行正则表达式替换操作时,请参考以下文档——http://docs..info/en///.html#using---in--text。

Vim中的Regex替换——http://.com/#

在进行正则表达式替换操作时,请访问——https://code..com/docs//#--。

在Emacs编辑器中,你可以通过使用正则表达式进行文本替换——详情请访问官方文档链接:https://www.gnu.org//emacs///emacs/-.html。

5.0 – 提取单行CSS注释

如果我们想要查找CSS文件中的所有单行注释怎么办?

CSS注释以/* Here */的格式出现。

要捕获任何单行CSS注释,我们可以使用以下表达式。

在这里,我们只是在每个捕获组之间添加了一个换行符\n。

尝试在有以下内容的文件上执行此替换。

图片

替换将产生相同的文件,但每个单行注释转换为多行注释。

图片

5.2 – 真实示例 – 标准化CSS注释开头

若我们手中持有的是一个庞大而混乱的CSS文档,该文档由数位作者共同创作而成。在该文档中,部分注释以斜杠加星号的形式开始,有的以斜杠加两颗星号作为起始,而另一些则使用斜杠加三颗星号来标记。

我们将编写一个正则表达式,用于将所有以/*开头的单行CSS注释进行标准化处理。

为了实现这一目标,我们计划对表达式进行扩充,使其仅能识别那些以两个或以上星号作为开头的注释内容。

这个表达式与原先的极为接近。其间的主要差异体现在,我们在开头将\*+替换为了\*{2,}。这里的\*{2,}语法代表了“两个或多个”\*的实例。

为了规范每个注释的开头,我们可以通过以下替代。

让我们在以下测试CSS文件上运行此替换。

图片

结果将是与标准注释开头相同的文件。

图片

6 – 匹配网址

另一个非常有用的Regex是在文本中匹配URL。

下面是一个来自Stack 的URL匹配表达式的示例。

图片

图片

脚本将打印在原始网页HTML内容中找到的每个域名。

图片

7 – 命令行的用法

众多Unix系统中的命令行工具都兼容正则表达式功能!接下来,我们将详细讲解如何运用grep命令来搜寻特定文件,同时也会演示sed命令在修改文本文件内容上的应用。

7.0 – 真实示例 – 用grep匹配图像文件

我们将定义另一个基本的Regexsublime text replace,这次是用于匹配图像文件。

My email is patrick.triest@gmail.com

命令运行后,电子邮件将从test.txt文件中进行编辑。

My email is {redacted}

警告:执行此指令会导致从您提供的test.txt文件中自动移除所有电子邮件地址,故在操作时需格外谨慎,该过程一旦进行便无法撤销。若希望在终端预览更改效果而不直接替换原文本,请确保不使用-i标志。

请注意——虽然该指令普遍适用于众多Linux操作系统,但在macOS中,sed是基于BSD实现的,其在正则表达式方面的支持相对有限。若想在macOS上使用sed并享受良好的正则表达式功能,我推荐您通过brew安装GNU的sed版本,即gnu-sed,并在命令行中用gsed代替sed进行操作。

8 – 什么时候不使用Regex

明白了,Regex确实是个功能强大且适应性强的工具,不是吗?!然而,在编写Regex时,是否也存在某些情况是我们应当避开的呢?当然有!

8.0 – 语言解析

解析结构化语言,无论是从英语过渡到Java,还是从Java转换到JSON,运用正则表达式都显得异常艰难。

数据源中的异常情况或细微的语法失误若引发表达式失效,往往会导致严重后果,或即时造成灾难。因此,自行编写正则表达式可能会让你感到十分沮丧。

强化型解析器几乎适用于所有机器能够解读的语言,同时自然语言处理工具则能够处理人类使用的语言——我强烈推荐您选用其中之一,而非自行尝试构建语言。

8.1 – 安全 – 输入过滤和黑名单

通过正则表达式对用户提交的内容进行筛选,同时阻止黑客向应用注入有害指令,如SQL注入,这样的做法似乎颇具吸引力。

采用自定正则表达式并不可取,因为这样的做法难以全面涵盖所有可能的攻击途径和有害指令。以黑客利用替代字符编码规避不完善的输入黑名单过滤器为例。

这是一个案例,我强烈推荐你采用经过充分检验的库或服务,并且采用白名单机制而非黑名单机制sublime text replace,以此确保你的应用程序能够抵御恶意数据的侵害。

8.2 – 性能密集的应用程序

正则表达式的执行效率存在较大差异,可能从较快到非常缓慢不等,这一差异主要取决于表达式的编写质量。在多数情况下,这种速度是可接受的,尤其是在处理较短的文本内容时,比如电子邮件地址列表。但针对需要高性能的服务器应用程序而言,正则表达式可能会成为性能的瓶颈,尤其是当表达式编写不当或搜索的文本内容较长时。

8.3 – 对于不需要Regex的地方

正则表达式确实是一项极为实用的工具,然而,这并不代表你应当随意在各个场合都运用它。

若存在更为简便的替代方法来解决问题,且该方法不涉及正则表达式或所需正则表达式更为简单,那么应避免仅仅为了展示而采用正则表达式。正则表达式虽然功能强大,但也是编程中难以理解的工具之一,并且容易遭遇边界问题和错误。

频繁运用正则表达式可能会让你的同事(以及所有需使用你代码的人)感到烦躁,有时甚至可能激发他们想要对你施以拳脚的冲动。

结论

我希望这是对Regex的许多用途的一个有用的介绍。

众多Regex的应用场景我们尚未详尽探讨。比如,在执行查询时,可以利用Regex对数据库中的特定文本格式进行灵活检索。

我们尚未详尽地介绍诸多 Regex 语法的高效特性,其中包括但不限于某些关键功能,例如……,以及……,还有……和……。

为了提升正则表达式的运用能力并深入掌握相关功能知识,以下资源值得推荐。

本教程所提供的示例源代码可在相应存储库内查阅——网址为https://.com//You--Learn-Regex。

欢迎随时对本教程提出任何建议、看法或批评。

如有侵权请联系删除!

13262879759

微信二维码