一直想学习正则表达式但被其复杂性所拖延?在本文中,我将向您展示五个易于学习的 RegEx 技巧,您可以立即在自己喜欢的文本编辑器中开始使用这些技巧。

文本编辑器设置

虽然现在几乎所有文本编辑器都支持正则表达式,但我将在本教程中使用 Visual Studio Code,但您可以使用任何您喜欢的编辑器。另外请注意,您通常需要在搜索输入附近的某处打开 RegEx。这是在 VS Code 中执行此操作的方法:

1) . — 匹配任意字符

让我们从简单的开始。点符号.匹配任何字符:

b.t

以上 RegEx 匹配"bot”,"bat”以及以 开头b和结尾的三个字符的任何其他单词t。但是如果你想搜索点符号,你需要用 转义它\,所以这个 RegEx 只会匹配精确的文本"b.t"

b\.t

2) .* — 匹配任何内容

这里的.意思是_“任何字符”_,*意思是_“这个符号重复任意次数之前的任何东西”。_它们连在一起 ( .*) 的意思是_“任意符号任意次数”。_例如,您可以使用它来查找以某些文本开头或结尾的匹配项。假设我们有一个具有以下签名的 javascript 方法:

loadScript(scriptName: string, pathToFile: string)

并且我们想要找到此方法的所有调用,其中pathToFile指向文件夹中的任何文件“lua”。您可以为此使用以下正则表达式:

loadScript.*lua

这意味着,“匹配所有以其开头的文本,“loadScript”然后是直到最后一次出现的任何内容“lua”

3)?— 非贪婪匹配

之后的?符号.*和其他一些 RegEx 序列表示“尽可能少地匹配”。如果您查看上一张图片,您会发现文本“lua”在每次匹配中出现两次,并且匹配到第二次为止的所有内容“lua”。如果您想匹配第一次出现的所有内容"lua",您可以使用以下 RegEx:

loadScript.*?lua

这意味着,“匹配所有以其开头"loadScript"的所有内容,直到第一次出现"lua"

4) ( ) $ — 捕获组和反向引用

好的,现在我们可以匹配一些文本了。但是,如果我们想更改找到的部分文本怎么办?为此,我们经常不得不使用捕获组。

让我们假设我们改变了我们的loadScript方法,现在它突然需要在它的两个参数之间插入另一个参数。让我们将这个新参数命名为id,因此新函数签名应如下所示:loadScript(scriptName, id, pathToFile)。我们不能在这里使用文本编辑器的普通替换功能,但正则表达式正是我们所需要的。

在上方您可以看到运行以下正则表达式的结果:

loadScript\(.*?,.*?\)

这意味着:“匹配以"loadScript("开头的所有内容,然后是第一个,,然后是第一个)

唯一对您来说可能看起来很奇怪的是\符号。它们用于转义括号。

我们需要转义符号()因为它们是 RegEx 用来捕获部分匹配文本的特殊字符。但是我们需要匹配实际的括号字符。

在前面的 RegEx 中,我们用.*?符号定义了方法调用的两个参数。让我们通过在它们周围添加和符号使我们的每个参数成为一个单独的捕获组:(``)

loadScript\((.*?),(.*?)\)

如果运行此 RegEx,您将看到没有任何变化。这是因为它匹配相同的文本。但是现在我们可以将第一个参数称为$1,将第二个参数称为$2。这称为反向引用,它将帮助我们做我们想做的事:在调用中间添加另一个参数:

搜索输入:

loadScript\((.*?),(.*?)\)

这与之前的 RegEx 含义相同,但将参数分别映射到捕获组 1 和 2。

替换输入:

loadScript($1,id,$2)

这意味着_“将每个匹配的文本替换为“loadScript(“后跟捕获组 1、“id”捕获组 2 和)”的文本。_请注意,您不需要在替换输入中转义括号。

5) [ ] — 字符类

[您可以通过在这些字符周围放置和符号来列出要在特定位置匹配的]字符。例如,class[0-9]匹配从 0 到 9 的所有数字。您也可以显式列出所有数字:[0123456789]— 含义相同。您也可以将破折号与字母一起使用,[a-z]将匹配任何小写拉丁字符,[A-Z]将匹配任何大写拉丁字符并[a-zA-Z]匹配两者。

您还可以*在字符类之后使用,就像 after 一样.,在这种情况下意味着:“匹配此类中出现的任意次数的字符”

PS

您应该知道有几种 RegEx 风格。我在这里讨论的是 javascript RegEx 引擎。大多数现代引擎都是相似的,但可能存在一些差异。通常,这些差异包括转义字符和反向引用标记。

我敦促您立即打开文本编辑器并开始使用其中的一些技巧。您会发现现在可以比以前更快地完成许多重构任务。一旦熟悉了这些技巧,就可以开始更多地研究正则表达式