所有正则表达式口味共有的功能?
我已经看到了不同的启用正则表达式的工具/语言(例如perl,sed,java,vim等)的正则表达式功能有很多共性,但是我也有很多不同之处。
是否有所有启用正则表达式的工具/语言都支持的正则表达式功能的标准子集?正则表达式功能在工具/语言之间如何变化?
解决方案
回答
http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
更详细的内容:http://www.regular-expressions.info/refflavors.html
回答
比较正则表达式口味
http://www.regular-expressions.info/refflavors.html
回答
如果我们使用的是grep regexp语法,而不是egrep或者sed regexp语法,那么我们应该在许多平台和工具上使用安全子集。
大概唯一会困扰你的是,当我们在使用有限状态自动机(FSA)的正则表达式实现和使用回溯的正则表达式实现之间进行转换时,例如从grep到Perl,量词的实现会有所不同。
基于FSA的实现将从第一个可能的位置开始找到最长的匹配项。回溯者将找到从第一个可能的位置开始的左偏的第一场比赛。也就是说,它将按模式中的顺序尝试每个分支,直到找到匹配项为止。
考虑字符串" xyxyxyzz"和模式"(xy)*(xyz)?"。基于FSA的引擎将匹配最长的子字符串" xyxyxyz"。基于回溯的引擎将匹配左偏的第一个子字符串" xyxyxy"。
回答
大多数正则表达式工具/语言都支持以下基本功能:
- 角色类/集合及其取反-[]
- 锚点-^ $
- 交替-|
- 量词-?+ * {n,m}
- 元字符-\ w,\ s,\ d,...
- 反向引用-\ 1,\ 2,...
- 点-。
- 像/ g和/ i这样的简单修饰符用于全局,并忽略大小写
- 转义字符
更高级的工具/语言支持:
- 前瞻性
- POSIX字符类
- 字边界
- 内联开关就像只允许对正则表达式的一小部分不区分大小写
- / x等修饰符允许额外的格式和注释,/ m修饰符则用于多行
- 命名捕获
- 统一码
回答
没有标准引擎。但是,POSIX扩展正则表达式格式是大多数引擎的有效子集,与我们可能会接近标准化子集的格式一样。
回答
请参阅emacs的正则表达式语法:http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps。
我记得曾经读过emacs的语法是固定的(出于向后兼容的原因),因此,如果我们想与所有内容兼容,请使所有内容与此兼容。一些工具可能支持它,而其他工具则可能不支持。
尽管我们有一个值得实现的目标,但我认为要实现它非常困难,而且我还发现emacs的正则表达式很难使用。如果它使我们更快乐,更高效,那么所有事物中的99%也许就足够好了?