RegEx中的Dot是危险的

时间:2008-11-20 16:45:21

标签: regex

我的印象是Dot'。' (外卡)角色使用危险。我的恐惧没有根据吗?感谢

8 个答案:

答案 0 :(得分:12)

只要你明白这意味着什么,这并不危险。它通常匹配输入文本的任何字符。根据正则表达式的风格,它可能匹配或不匹配行尾字符。

答案 1 :(得分:8)

钠是危险的,但它是生命所必需的。 Dot就像任何其他工具一样,只有像你做的那样危险。我不想在没有它的情况下尝试编写99%的正则表达式。

答案 2 :(得分:8)

我看到的唯一棘手的部分'。'是在匹配多行字符串时:使用错误的选项,它可以匹配比需要的更多,并且它可以引入bacjtracking问题(由于非贪婪的匹配)。

来自regex tutorial

该点匹配单个字符,而不关心该字符是什么。唯一的例外是换行符。

在大多数正则表达式中,默认情况下,点与新行字符不匹配。因此,默认情况下,点是否定字符类[^ \ n](UNIX正则表达式)或[^ \ r \ n](Windows正则表达式)的缩写。

这种例外主要是出于历史原因。使用正则表达式的第一个工具是基于行的。他们会逐行读取文件,并将正则表达式分别应用于每一行。结果是,使用这些工具,字符串永远不会包含换行符,因此点永远不会匹配它们。

答案 3 :(得分:6)

VonC打扰我指出my article。 “谨慎使用点”一节回答了你的问题。

问题不在于点。问题在于人们在不合适的情况下使用它。

答案 4 :(得分:5)

我不会说“危险”,至少不是一般的。但是:

  • 。*应尽可能避免使用*,因为它可以通过大量的回溯来消除你的正则表达式的性能,因为它试图找到最佳匹配,如果它后面的令牌在输入中出现多次,你可能不会得到你想要的比赛,因为它正在寻找最长的比赛。 。*?有助于回溯问题,并消除“太长的匹配”问题,但不使用。根本就会更有效。

  • 因为。可以匹配任何东西(除了通常是行尾),它可能匹配你不打算/期望的东西。在安全意识的背景下,这可能是危险的。

答案 5 :(得分:3)

不要忘记您经常可以使用[^x]*代替.*?x。如果需要,后者可以消耗x来完成匹配,但前者不能。的。如果允许正则表达式匹配多行字符串,则更有可能是危险的。能够代表换行符。无论如何,当你使用.*.*?时,你应该真正关心,尽管有很多情况下你会想要它。 .{0,10}之类的东西不太容易导致你的正则表达式开始变得非常慢。

答案 6 :(得分:2)

点并不具有内在的危险性,但人们往往过于依赖它。事实上,有一段时间我发现提高你的正则表达能力的好方法是停止使用点 - 或者至少尝试尽可能少地使用它。这将迫使您思考正则表达式匹配的工作原理,并探索您从未学过的其他更高级的功能。

与许多其他工具一样,很容易陷入中等水平的正则表达式,并且从未真正掌握它们。这让我觉得这是一个将自己拖过驼峰的好方法。请注意,我并不是说你再也不应该使用这个点了。当你发现其他正则表达式提供的东西时,只需休息几个月。

答案 7 :(得分:0)

这取决于用法。例如,.*在搜索文件时非常棒。如果你有这样的正则表达式可能会很糟糕:

.*<one>.*<two>.*<three>.*</three>.*</two>.*</one>.*

由于其他人所说的原因,这取决于这些括号之间的内容,这可能导致大量的回溯并且非常慢。

相关问题