代码之家  ›  专栏  ›  技术社区  ›  zildjohn01

regex比较

  •  4
  • zildjohn01  · 技术社区  · 15 年前

    我(终于)开始学习regex了,我想知道这两个模式字符串之间是否有显著的区别。我正在尝试匹配诸如“的线条 Title=Blah ,并在两个组中匹配“title”和“blah”。

    问题出在诸如“的标题上。 Title=The = operator “。以下是解决问题的两种选择:

    ^([^=]+)=(.+)$
    ^(.+?)=(.+)$
    

    这两者之间有什么区别,性能方面还是功能方面?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Jim G.    15 年前

    第一个要求在=之前至少有一个非-=字符才能匹配,而第二个则不匹配;它将在前导==上匹配。

    根据你的内容,第一个 能够 跑得更快。 Here's why :

    懒惰的替代品
    在这 有比这更好的选择 使加号变懒。我们可以使用 贪婪的加分和否定的性格 类:<[^=+>。这是为什么 更好的是因为回溯。 使用Lazy Plus时,发动机 必须对中的每个字符进行回溯 它正在尝试的HTML标记 比赛。当使用否定的 字符类,无回溯 当字符串包含 有效的HTML代码。回溯速度变慢 关闭Regex引擎。你不会 注意在执行 在文本编辑器中进行单一搜索。但是 您将节省大量的CPU周期 当在 脚本中的一个紧密循环 写作…

        2
  •  5
  •   chaos    15 年前

    第一个要求至少有一个非- = 前一个字符 = 为了匹配,第二个不匹配;它将匹配领先者 == .

    至于性能,我并不期望有什么有意义的区别,但如果你真的在乎,唯一要做的就是分析它。我将编写一对脚本,每个脚本运行数十万次方法中的一个,并使用Unix对它们进行计时。 time 命令。

        3
  •  1
  •   Dinah SLaks    15 年前

    一个很好的问题,但不幸的是,它将取决于regex引擎。您必须对其进行分析,以了解运行时的差异。好吧,我想如果你有引擎的源代码,那么你可以做决定,但我假设情况并非如此。

        4
  •  1
  •   Stephen C    15 年前

    在性能方面,它(理论上)将取决于您正在使用的regex的实现。虽然这里可能不是这样,但有问题的正则表达式的实现之间可能存在深刻的差异。例如,regex a?a?a?aaa 应用于由n“a”s组成的字符串,其复杂性为 O(N**3) 使用典型的(即基于DFA的)regex引擎。

    有关详细信息,请参阅:“ Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...) “Russ Cox。

        5
  •  0
  •   Todd    15 年前

    两者都反对 '==test'