正则表达式入门
正则表达式(regex)是人们似乎经常嘲笑的东西之一,因为他们不理解它们,或者部分理解它们。
在 Ben Hong 发推文寻求好的正则表达式资源后,我决定写这篇文章。
这篇文章能让你成为正则表达式专家吗?不能,但它会告诉你一些开发人员在编写正则表达式时容易犯的错误。
文章中显示的示例代码片段将用于 JavaScript 中的正则表达式,但您应该能够在您选择的语言中使用它们,或者至少在语法略有不同的情况下使用概念。
具体一点
明确地知道你在寻找什么。这表面上看起来显而易见,但并非总是如此。假设我想three
在一个文本文件中查找 的实例,因为我们需要将所有 的实例替换three
为数字3
。你已经在谷歌上搜索过,或者查看过regex101.com。你感觉还不错,所以你写出了这个正则表达式。
const reMatchThree = /three/g
注意:如果您不熟悉正则表达式,那么起始/
和结束之间的所有内容/
都是正则表达式。g
最后一个之后的/
表示全局,例如查找所有实例。
你运行正则表达式来匹配所有 ,three
以便将其替换为3
。你查看文本中被替换的内容,有点困惑。
- There were three little pigs who lived in their own houses to stay safe from the big bad wolf who was thirty-three years old.
+ There were 3 little pigs who lived in their own houses to stay safe from the big bad wolf who was thirty-3 years old.
three
文件中所有地方都被替换了3
,但为什么 33 被替换了?你只想three
替换 s 。现在我们来学习第一课。要具体。我们只想匹配单词three
。所以我们需要稍微增强一下这个正则表达式。我们只想在 是句子的第一个单词、前后有空格或前后有标点符号,或者它是句子的最后一个单词时找到three
。根据这些条件,正则表达式现在可能看起来像这样。
const reMatchThree = /\b(three)\b/g
注意:如果您不熟悉所有语法,请不要担心。\b
字符 表示单词边界字符。
当正则表达式的各个部分包含在括号中时,它表示一个组,并且该组中的内容将作为匹配的一部分以组的形式返回。
不要太贪心
贪婪通常不是什么好事,正则表达式中的贪婪也不例外。假设你的任务是找出双引号之间的所有文本片段。为了便于示例说明,我们假设最理想的情况是,双引号字符串中不包含双引号字符串。
您开始构建您的正则表达式。
const reMatchBetweenDoubleQuotes = /"(.+)"/g
记住,(
和)
代表一组字符。.
字符 表示任意字符。另一个特殊字符是+
。它表示至少一个字符。
您感觉很好,并在需要从中提取文本的文件上运行此正则表达式。
Hi there "this text is in double quotes". As well, "this text is in double quotes too".
结果出来了,这里是正则表达式匹配的双引号内的文本:
this text is in double quotes". As well, "this text is in double quotes too
等一下!?这不是你期望的。双引号里明明有两组文本,哪里出错了?第二课。别太贪心。
如果我们再看一下你创建的正则表达式,它包含 ,.+
这意味着它会尽可能多地匹配任意字符,这就是为什么我们最终只匹配了 ,this text is in double quotes". As well, "this text is in double quotes too
因为"
它被认为是任意字符。你太贪心了,或者更确切地说,是正则表达式太贪心了。
有几种方法可以解决这个问题。我们可以使用非贪婪版本的+
,将其替换为+?
const reMatchBetweenDoubleQuotes = /"(.+?)"/g
这意味着找到一个"
,启动一个捕获组,然后在击中之前找到尽可能多的字符"
我更喜欢的另一种方法如下:
const reMatchBetweenDoubleQuotes = /"([^"]+)"/g
这意味着找到一个,启动一个捕获组,然后在命中之前"
找到尽可能多的字符。"
"
注意:我们引入了一些特殊字符。[
和]
表示匹配以下任意字符。在我们的用例中,我们将它与^
(即 )一起使用,[^
表示不匹配以下任意字符。在我们的例子中,我们表示不匹配该"
字符。
专注于你正在寻找的内容
既然我们已经了解了一些常见的陷阱,值得注意的是,贪心或不具体都是可以的。我希望你记住的重点是,认真思考你在寻找什么,以及你想找到多少。
正则表达式在文本处理方面非常强大,现在你已经掌握了一些可以添加到正则表达式工具箱中的知识!下次再见!
资源
- regex101.com
- 正则表达式信息
- 掌握正则表达式第三版
- 正则表达式 | MDN
- regexper(感谢@link2twenty!)
- VerbalExpressions存储库(感谢@citizen428!)