我正在处理一个使用正则表达式的函数来查找作为参数给出的(非常长的)字符串中的一些产品代码。
该代码有许多可能的形式,例如:
UK[A-z]{10}
或DE[A-z]{20}
或PL[A-z]{7}
或......
哪种解决方案会更好?许多(大概20-50左右)小正则表达式或一个巨大的怪物正则表达式匹配它们全部?什么是性能更好?
答案 0 :(得分:3)
这取决于你写的是什么样的大正则表达式。如果以病态模式结束,最好测试较小的模式。例如:
UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7}
这种模式非常低效,因为它以交替开始,这意味着在最坏的情况下(不匹配),需要对字符串中的所有位置测试每个替代方案。
但是如果你写这样的模式:
(?=[UDP][KEL])(?:UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7})
或变体:
[UDP][KEL](?:(?<=UK)[A-Za-z]{10}|(?<=DE)[A-Za-z]{20}|(?<=PL)[A-Za-z]{7})
在交替之前很快就会丢弃大多数无法匹配的位置。
此外,当您编写单个模式时,显然,该字符串仅被解析一次。