非贪婪搜索和否定字符集之间的区别

mpe*_*pen 7 regex

这两个正则表达式模式之间是否有任何区别(假设启用了单行模式):a.*?b和a[^b]*b?在性能方面呢?

dee*_*see 4

a.*?b必须检查每个使用的字符是否与模式匹配(即下一个字符是否是 a b)。这称为回溯。

使用字符串,a12b执行将如下所示:

  • 消耗a
  • 消耗以下 0 个字符。下一个是a吗b?不。
  • 消耗以下字符(a1)。下一个是a吗b?不。
  • 消耗以下字符(a12)。下一个是a吗b?是的!
  • 消耗b
  • 匹配

a[^b]*b消耗任何不是 a 的东西b而不问自己问题,因此对于较长的字符串来说速度要快得多。

使用字符串,a12b执行将如下所示:

  • 消耗a
  • 消耗后面的任何不是b. (a12 )
  • 消耗b
  • 匹配

RegexHero有一个基准测试功能,可以使用 .NET 正则表达式引擎来演示这一点。

除了性能差异之外,它们与您的示例中的相同字符串匹配。

然而,在某些情况下两者之间存在差异。在字符串中aa111b111b

(?<=aa.*?)b匹配两个b,而(?<=aa[^b]*)b仅匹配第一个。