a.*?b必须检查每个使用的字符是否与模式匹配(即下一个字符是否是 a b)。这称为回溯。
使用字符串,a12b执行将如下所示:
ab?不。a1)。下一个是a吗b?不。a12)。下一个是a吗b?是的!ba[^b]*b消耗任何不是 a 的东西b而不问自己问题,因此对于较长的字符串来说速度要快得多。
使用字符串,a12b执行将如下所示:
ab. (a12 )bRegexHero有一个基准测试功能,可以使用 .NET 正则表达式引擎来演示这一点。
除了性能差异之外,它们与您的示例中的相同字符串匹配。
然而,在某些情况下两者之间存在差异。在字符串中aa111b111b
(?<=aa.*?)b匹配两个b,而(?<=aa[^b]*)b仅匹配第一个。