关于正则表达式(Regex)--一篇文章带你学透正则表达式模式

461 阅读4分钟

了解正则表达式的基础知识,在提取模式方面变得更加有效

正则表达式示例 - 图片来源:作者

如果你像我一样,一开始,正则表达式模式看起来就像胡言乱语。但在仔细注意之后,你会发现它们实际上并不像看上去那么令人生畏。

就像许多概念一样,从一个例子开始通常是有帮助的,所以让我们在这里使用这个例子。

比方说,我们试图从一个电子邮件地址的域名中提取名称,比如这个:example@gmail.com;所以在这种情况下,我们将试图只提取 "gmail "部分。

为了练习,我强烈建议你使用这个网站:https://regex101.com/

在我们开始处理我们的例子之前,让我们看看一些你可能遇到或需要的常见字符。

  • + 正则表达式中的字符+意味着 "与前面的字符匹配一次或多次"。例如 ,ab+c 匹配 "abc"、"abbc"、"abbbc",但它不匹配 "ac"。正则表达式中使用的加号被称为克莱因加号,是以提出这一概念的数学家斯蒂芬-克莱因(1909-1994)命名的。
  • * 这个字符在正则表达式中意味着 "与前面的字符匹配0次或更多次"。例如 ,ab*c 匹配 "abc"、"abbc"、"abbbc "和 "ac"。这也同样被称为Kleene星。
  • 问号**?**表示前面的元素出现了_零次或一次_。 **例如,**colou?r 同时匹配 "color "和 "color"。
  • .句号匹配任何单一字符。例如,a.c匹配 "abc"、"adc"、"aec "等。如果我们想匹配字母 "c "前面的多个字符,我们只需使用上面的星号*,像这样:a.*c,这将匹配**"**abdefghc"。
  • [a-z] : 这是非常有用的,因为它定义了一个可能的值的范围。这里只是指从a到z的所有小写字母。我们可以对大写字母和所有正数做同样的处理,比如 [A-Z] & [0-9] 。
  • ^: 这匹配任何一行的起始位置。
  • [^b]at 匹配所有由.at匹配的字符串,除了 "bat"。因此,当在方括号内使用时,^后面的字母被排除。
  • ^[hc]at 匹配 "hat "和 "cat",但只在字符串或行的开头。

现在我们已经有了相当的装备,让我们再看看我们的例子。因此,要想只获得电子邮件地址的域名部分,我们将使用这个正则表达式。

@([a-zA-Z0-9_.+-]+)\.[a-zA-Z0-9_.+-]

正则表达式示例 - 图片来自作者

这将返回 "gmail",这就是我们想要的。

下面是我们例子中每个元素的分类。

  • @:这表示我们希望我们的搜索从"@"开始。
  • ():这个括号允许我们只分离出我们想要返回的搜索模式的一部分。去掉这些括号将使我们能够匹配"@"之后的所有内容。@gmail.com
  • []:方括号允许我们包括所有我们想匹配的字符,甚至包括像这样的范围:a-z和0-9。我们在范围之后还有其他字符,如"_"、"."、"+"、"-"等,这些都是我们表达式寻找的字面字符。如果需要的话,我们还可以包括特殊字符,如德语字母,例如:"Ü"
  • +:我们已经看到,"+"与前面的字符匹配一次或多次。由于这是在我们的方括号外,我们基本上是多次匹配方括号内的所有内容。很酷,是吗?
  • \:退格符转义了句号,这样我们的正则表达式就不会认为它是我们上面定义的量词的一部分。我们需要将句号作为我们模式的一部分,因为它在我们的搜索词"example@gmail.com "中。
  • ...:句号在大括号()之外,所以我们的正则表达式将寻找该点之前的所有字符串以及后面的方括号。

现在让我们假设我们只想从电子邮件地址 "example@gmail.com "中提取 "example",我们只需在上面使用的模式前面添加另一个模式,像这样([a-zA-Z0-9_.+-]+)。注意,括号()现在在正则表达式的第一部分前面,表明这是我们想要提取的唯一部分。

([a-zA-Z0-9_.+-]+)@[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9_.+-]

图片由作者提供

题外话

要使用正则表达式提取德语字符,你只需在你的模式中包含它们,就像这样。

([a-zA-Z0-9äüö_.+-]+)@[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9_.+-]

这将"Schäfer@example.com "返回" Schäfer"。

希望这对你有帮助,并欢迎你在评论中分享其他技巧和窍门。