Regex Balancing Act
好的正则表达式必须在这些方面求得平衡:
●只匹配期望的文本,排除不期望的文本。
●必须易于控制和理解。
●如果使用NFA引擎,必须保证效率(如果能够匹配,必须很快地返回匹配结果,如果不能匹配,应该在尽可能短的时间内报告匹配失败)。
这些方面常常是与具体文本相关的。如果我只使用命令行,只需要快速地grep某些东西,可能不会过分关心匹配的准确性,通常也不会花太多精力来调校。我不在乎多花点时间来手工排查,因为我能够迅速地在输出中找到自己需要的内容。但是,如果处理重要的程序,就需要花费时间精力来保证正确性:如果需要,正则表达式也可能很复杂。这些因素都需要权衡。
即使使用同样的程序,效率也是与具体文本相关的。如果是 NFA,用「^-(display|geometry|cemap|…|quick24|random|raw)$」之类长长的正则表达式来检验命令行参数的效率就很低,因为多选分支过多,但如果它只用于检验命令行参数(可能只是在程序开始的时候运行若干次),即使所需时间比正常的长100倍也不要紧,因为这时候效率并不是问题。但是,如果要逐行检查很大的文件,低效率的程序运行起来会让你痛苦不堪。