我已经看到了不同正则表达式工具/语言(例如perl,sed,java,vim等)的正则表达式功能的很多共性,但我也有很多差异。
是否有所有正则表达式工具/语言都支持的正则表达式标准子集的正则表达式功能?工具/语言之间的正则表达式功能有何不同?
答案 0 :(得分:12)
http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
更详细:http://www.regular-expressions.info/refflavors.html
答案 1 :(得分:12)
答案 2 :(得分:1)
如果您使用了grep regexp语法,而不是egrep语法或sed regexp语法并使用了它,那么您应该在许多平台和工具中使用安全子集。
关于你可能会咬你的唯一一件事就是你在使用有限状态自动机(FSA)的正则表达式实现与使用回溯的正则表达式之间进行转换,例如:量词实现将从grep到Perl不等。
基于FSA的实施将从第一个可能的位置开始找到最长的匹配。回溯的第一场比赛将从第一个可能的位置开始。也就是说,它将按照模式中的顺序尝试每个分支,直到找到匹配为止。
考虑字符串"xyxyxyzz"
和模式"(xy)*(xyz)?"
。基于FSA的引擎将匹配最长的子字符串"xyxyxyz"
。基于反向跟踪的引擎将匹配左偏的第一个子字符串"xyxyxy"
。
答案 3 :(得分:1)
大多数正则表达式工具/语言都支持这些basic capabilities:
更高级的工具/语言支持:
答案 4 :(得分:0)
没有标准引擎。但是,POSIX扩展正则表达式格式是大多数引擎的有效子集,可能与您获得标准化子集的距离非常接近。
答案 5 :(得分:0)
请参阅emacs的正则表达式语法:http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps。
我记得读过emacs的语法是一成不变的(出于向后兼容的原因),所以如果你想与所有东西兼容,那就让所有东西都与之兼容。有些工具可能会支持它,有些则可能不支持。
虽然你有一个有价值的目标,但我觉得要达到这个目标非常困难,而且我也发现emacs的regexps很难实现。也许99%的一切都足够好,如果它让你更快乐,更富有成效?