正则表达式在日常工作中的 6 个用例

2025-06-10

正则表达式在日常工作中的 6 个用例

在本文中

  1. 什么是正则表达式?
  2. 正则表达式简介
  3. 何时使用正则表达式?
  4. 了解有关正则表达式的更多信息

什么是正则表达式

Regex,即正则表达式,学起来很难。用简单的语言来定义它几乎同样困难。维基百科目前用一句话来描述正则表达式:在文本中指定搜索模式的字符序列。

这意味着,正则表达式用于在文本中查找字符。我所说的字符是指字母、数字、括号、换行符等等。使用正则表达式,你可以编写一个表达式来定义要在文本中查找的字符序列。

理解表达式语言的语法是学习(和记住)的难点。我们将在接下来的文章中详细介绍您需要了解的所有内容,包括基础用法和高级用法。本系列的第一篇文章旨在解释为什么您应该学习正则表达式。

正则表达式的复数
又一个让你保持清醒的想法

正则表达式简介

正则表达式本身仅用于在字符串或文本中查找文本出现的位置(匹配项)。我们想要如何处理匹配项则取决于我们自己。使用正则表达式时,我们通常关注以下三件事之一。

  • 在文本中查找信息
  • 检查字符串是否与正则表达式匹配,例如电子邮件验证
  • 替换文本中的字符

尽管正则表达式的用例通常归结为回答“是”或“否”的问题、查找文本出现的位置或替换某些字符,但它可以在很多场景中使用。我们现在来看一下其中的几个。

何时使用正则表达式?

大多数开发人员一辈子都不需要学习正则表达式。通常,即使正则表达式是个好主意,也并非完全必须使用它。遗憾的是,其他解决方案通常需要花费更多时间来实现,而且在需要处理更多数据的用例中,其扩展性较差。

对于“正则表达式何时使用?”这个问题,简短而乏味的答案是“很多事情都用正则表达式”。详细的答案如下。

搜索文件、手册和日志

我第一次接触正则表达式是在学习 Unix 的时候。最初的经历是在 Unix 手册页和日志文件里查找信息。它看起来差不多是这样的。

// Finds all lines that contain the word "error" and later "vehicle" in the file somelogfile.log. Useful to see if we have logged any errors which mention anything about a vehicle.
grep -i 'error.*vehicle' ./somelogfile.log

// Searches through the Unix manual for scp command and outputs what the v flag does.
man scp | grep -i '\-v'
// Output in Mac terminal:
// -v  Verbose mode.  Causes scp and ssh(1) to print debugging messages
Enter fullscreen mode Exit fullscreen mode

上面的例子可能看起来像教科书上的例子,事实也的确如此。这就是我们上学的原因,为了学习有用的东西!当然,你也可以随时通过 Google 来查找 Unix 命令的标志位,虽然可能需要更长的时间,但仍然很快。

不过,搜索日志文件是你必须自己动手的事情。我每天在工作中都会这样做,以调查错误。对于大型日志文件,如果我简单地搜索“警告”或“错误”,可能会找到数百或数千个匹配项。编写正则表达式确实可以帮助我在所有这些结果中进行筛选,因为它可以使用正则表达式指定更精细的搜索词。

IDE 中的正则表达式搜索

您是否曾经在 IDE 中搜索文本时意外勾选了正则表达式复选框,然后却找不到想要的内容?下次遇到这种情况时,请不要取消勾选它。找到一种在勾选了正则表达式复选框的情况下也能搜索到所需内容的方法!

正则表达式搜索按钮 meme
我要为这件事负上责任,这种事已经发生过很多次了。

也许你知道自己正在某个地方调用一个非常常见的函数,但却不记得它在哪儿,也不记得这个函数叫什么。这里有一些表达式可以解释这种情况!如果你看不懂也不用担心,几周后我会在这里发布另一篇文章来解释正则表达式的语法。

// Finds a console log that prints a count variable.
conso.*count
// Example: console.log(count)
// Example: console.log(`Total: ${count}`)
// Example*: console.log(itemCount)

// Finds a function which name ends with "count" and has an argument which includes the text "todo".
count\(.*todo
// Example: count(todoItems)
// Example*: updateCount(oldCount, newTodoItem)

// * these examples only match if case sensitivity is disabled, which is done either in the IDE or by using the regex flag i
Enter fullscreen mode Exit fullscreen mode

经典示例,表单验证

如果没有提到这个经典的例子,这篇文章就不完整了。当你看到“正则表达式”这个词时,你想到的可能就是这个,也就是用正则表达式验证表单。这是必不可少的。

您既可以验证电子邮件是否有效,也可以验证电话号码的格式是否正确。您还可以禁止用户名中包含脏话和粗俗词汇,或者检测信用卡号是万事达卡还是维萨卡。您甚至可能需要确保密码包含特殊字符。所有这些示例都可以使用正则表达式。

使用正则表达式进行表单验证
我对正则表达式很满意,但不会碰 CSS

像专业人士一样查找和替换(或操作字符串)

我偶尔会在工作中遇到一些非常无聊的任务。可能是某个 API 端点更新了,需要进行大量修改,因为它到处都是硬编码。也可能是数据从生产数据库转储到 JSON 文件中,用作开发数据,为此,必须将所有电子邮件地址替换为虚拟地址。

硬编码的 API 示例听起来像是快速查找和替换的工作,事实也确实如此,但你可能需要了解正则表达式才能做到这一点。请查看以下 URL。

  • https://regexexampledomain.com/articles/react/some-react-article
  • https://regexexampledomain.com/articles/react/react-is-awesome
  • https://regexexampledomain.com/articles/javascript/a-javascript-article

上面的 URL 遵循这样的模式:/articles/<category>/<article-name>。想象一下,如果我们有成千上万个这样的链接,包含成千上万个类别,而我们重构了网站,URL 中不再包含诸如 react 和 javascript 之类的类别,那会怎么样呢?

我们可以相当安全地逐个查找并替换类别,例如,用一个斜杠替换/react//javascript/即可删除类别。但请记住,该网站有数千个类别,手动执行此操作需要时间。

使用正则表达式,我们可以使用一次查找和替换来更新所有这些类别,无论我们有多少个类别。

那么电子邮件混淆的例子呢?我们如何在 JSON 文件中查找并替换任何包含john.doe@gmail.com的电子邮件呢?我们只需要一个电子邮件地址的正则表达式,以及编程语言或 IDE 中的替换函数。然后,我们只需点击一个按钮,搜索 JSON 数据,就能看到它确实成功替换了电子邮件。

悲伤的约翰·多伊
John Doe 的电子邮件没有被混淆

API 和 Web 控制台中的用法

正则表达式应用广泛,许多服务和 API 都支持它。这意味着处理海量数据的 SaaS 平台很有可能提供某种正则表达式解决方案。它可以是日志工具 Web 控制台中的搜索字段,也可以是允许使用正则表达式的 SDK 或 API。例如,参见Elasticsearch 正则表达式查询

使用正则表达式解释和分类数据

到目前为止,大多数描述的正则表达式示例都涉及处理或验证数据。然而,正则表达式也可以用来解释和分类数据。

让我们举个例子,输入数据是单个单词,可以是字符串、整数、浮点数、数组或对象。我们的目标是检测它是哪一种。

Input: 402
Output: integer

Input: 402 is an integer
Output: string

Input: 4.2
Output: float

Input: the number 4.2 is a float, not an integer
Output: string

Input: ['hello', 4.2]
Output: array

Input: {"hello": 4.2}
Output: object
Enter fullscreen mode Exit fullscreen mode

当然,上面的问题可以通过大量的 if 语句和循环遍历字母来检测输入是否包含这些字母来解决。然而,使用正则表达式,我们可以更轻松地解决这个问题。我们可以使用如下所示的正则表达式来立即检测类型。

Regex: /^[0-9]+$/
Detects: integer

Regex: /^[0-9]+\.[0-9]+$/
Detects: float

Regex: /^\[.*\]$/
Detects: array

Regex: /^\{.*\}$/
Detects: object
Enter fullscreen mode Exit fullscreen mode

使用上述正则表达式,我们只需几行代码就能检测整数、浮点数、数组和对象。为了检测字符串,我们可以创建一个更复杂的正则表达式,确保它不以括号开头,并且包含字母表中的字母。但当输入不是其他任何类型时,使用字符串作为默认的回退值也足够了。

以这种方式使用正则表达式可以节省一些代码行。在其他场景中,使用正则表达式可能至关重要。以服装尺码为例。像 XL 这样的大小写有很多种方法。如果我们想将所有可能的写法映射到其中一种,该怎么办?

## Examples of input: l, L, large, Large, lg, LG, L slim, L wide
Output: L

## Examples of input: xl, XL, extra large, extra-large, x large, x-large, X-Large
Output: XL

## Examples of input: xxl, XXL, 2xl, 2XL
Output: XXL
Enter fullscreen mode Exit fullscreen mode

发现问题了吗?这个问题用正则表达式很容易解决。如果没有正则表达式,我们就得硬编码一大堆大小的映射。这绝对是一个有效的解决方案。但如果大小也可以是数字呢?

比如说,我们有一件 L 码的 T 恤,它的欧洲尺码是 52,或者可能是 52-54 之间的数字?我们有很多东西需要硬编码。

虽然正则表达式在这种情况下非常有用,但我们无法用单个正则表达式来解决这个问题,我们需要相当多的正则表达式。不过,我们不需要很多正则表达式,因为单个正则表达式可以匹配许多不同的大小写变体。

了解有关正则表达式的更多信息

我们在本文中看到的正则表达式用例仅仅是示例。这类问题并非总是需要用正则表达式来解决。有时使用正则表达式反而有些过度。有时,不用正则表达式和用正则表达式一样简单。这是你在面对问题时必须做出的决定。对于某些问题,你会意识到,没有正则表达式根本无法解决问题。

如果您想了解更多关于正则表达式的知识,请保存这篇文章以供日后阅读或关注我。下个月我会发布另一篇文章。

鏂囩珷鏉ユ簮锛�https://dev.to/perssondennis/6-use-cases-for-regex-in-your-daily-work-508b
PREV
Next.js 常见问题解答
NEXT
我希望有的 DevOps 简介