我已经看到不同的支持正则表达式的工具/语言(例如 perl、sed、java、vim 等)的正则表达式功能有很多共性,但我也有很多不同之处。
是否有所有支持正则表达式的工具/语言都支持的正则表达式功能的标准子集?正则表达式功能在工具/语言之间有何不同?
我已经看到不同的支持正则表达式的工具/语言(例如 perl、sed、java、vim 等)的正则表达式功能有很多共性,但我也有很多不同之处。
是否有所有支持正则表达式的工具/语言都支持的正则表达式功能的标准子集?正则表达式功能在工具/语言之间有何不同?
http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
更详细:http ://www.regular-expressions.info/refflavors.html
如果您采用了 grep 正则表达式语法,而不是 egrep 语法,或者使用了 sed 正则表达式语法,那么您应该在许多平台和工具中使用一个安全的子集。
唯一可能让您感到困扰的事情是,当您在使用有限状态自动机 (FSA) 的正则表达式实现和使用回溯的实现之间切换时,例如量词的实现会从 grep 到 Perl 有所不同。
基于 FSA 的实现将从第一个可能的位置开始找到最长的匹配。回溯将找到左偏的第一个匹配项,从第一个可能的位置开始。也就是说,它将按模式中的顺序尝试每个分支,直到找到匹配项。
考虑字符串"xyxyxyzz"
和模式"(xy)*(xyz)?"
。基于 FSA 的引擎将匹配可能的最长子字符串"xyxyxyz"
. 基于回溯的引擎将匹配左偏的第一个子字符串"xyxyxy"
.
大多数正则表达式工具/语言都支持这些基本功能:
更高级的工具/语言支持:
没有标准引擎。但是,POSIX 扩展正则表达式格式是大多数引擎的有效子集,并且可能与您将获得的标准化子集一样接近。
查看 emacs 的正则表达式语法:http ://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps 。
我记得读过 emacs 的语法是一成不变的(出于向后兼容性的原因),所以如果你想与一切兼容,让一切都与此兼容。有些工具可能支持它,有些可能不支持。
虽然你有一个有价值的目标,但我认为它很难实现,而且我还发现使用 emacs 的正则表达式很痛苦。如果它能让你更快乐、更有效率,也许 99% 的事情就足够了?