正则表达式写起来容易,匹配起来却有一套内部规则。理解“贪婪”与“回溯”这两个概念,很多“玄学”问题就清楚了。
贪婪匹配
正则里的量词(*、+、? 等)默认是贪婪的,会尽量匹配更多字符。例如用 a.*b 匹配 axbzb,结果不是 axb,而是整个 axbzb。
回溯是怎么发生的
贪婪匹配的特点是“先吞后吐”:引擎先尽量多匹配,如果正则的后续部分匹配失败,就一步步退回重试,这个退回的过程就叫回溯。
性能陷阱
像 .*ab 这样的正则遇到长文本时,回溯次数可能极多,甚至导致卡顿。想尽量少匹配,可在量词后加问号,如 a.*?b;部分引擎还支持独占模式(量词后加 +),直接放弃回溯换取性能,但并非所有语言都支持。