Regex 所有正则表达式的通用特性?

Regex 所有正则表达式的通用特性?,regex,language-agnostic,Regex,Language Agnostic,我已经看到不同的支持正则表达式的工具/语言(例如perl、sed、java、vim等)的正则表达式功能有很多共同之处,但我也有很多不同之处 是否有所有启用正则表达式的工具/语言都支持的正则表达式功能的标准子集?不同工具/语言之间的正则表达式功能如何变化? 更详细:比较正则表达式的风格 如果您使用了grep regexp语法,而不是egrep语法,或者sed regexp语法,那么您应该跨许多平台和工具使用一个安全的子集 那么,唯一可能让您感到不快的是,当您在使用有限状态自动机(FSA)的rege

我已经看到不同的支持正则表达式的工具/语言(例如perl、sed、java、vim等)的正则表达式功能有很多共同之处,但我也有很多不同之处

是否有所有启用正则表达式的工具/语言都支持的正则表达式功能的标准子集?不同工具/语言之间的正则表达式功能如何变化?



更详细:比较正则表达式的风格


如果您使用了grep regexp语法,而不是egrep语法,或者sed regexp语法,那么您应该跨许多平台和工具使用一个安全的子集

那么,唯一可能让您感到不快的是,当您在使用有限状态自动机(FSA)的regexp实现和使用回溯的regexp实现之间切换时,例如,量词实现将从grep到Perl有所不同

基于FSA的实现将发现从第一个可能的位置开始的最长匹配。回溯会发现左偏的第一个匹配,从第一个可能的位置开始。也就是说,它将按照模式中的顺序尝试每个分支,直到找到匹配项为止


考虑字符串
“XYXYZZ”
,以及模式
“(xy)*(xyz)?”
。基于FSA的引擎将匹配最长的子字符串,
“xyzyz”
。基于回溯的引擎将匹配左偏的第一个子字符串,
“xyxyxy”

大多数正则表达式工具/语言都支持这些:

  • 字符类/集及其否定-[]
  • 锚-^$
  • 交替-|
  • 量词-?+*{n,m}
  • 元字符-\w\s\d
  • 反向引用-\1、\2、
  • 点-
  • 全局和忽略大小写的简单修饰符,如/g和/i
  • 转义字符
  • 更高级的工具/语言支持:

  • 向前看和向后看
  • POSIX字符类
  • 词界
  • 内联开关,比如只允许正则表达式的一小部分不区分大小写
  • 像/x这样的修饰符允许额外的格式和注释,/m表示多行
  • 命名捕获
  • 统一码

  • 没有标准的引擎。但是,POSIX扩展正则表达式格式是大多数引擎的有效子集,可能与标准化子集最接近。

    请参阅emacs的正则表达式语法:

    我记得读过这样一篇文章,emacs的语法是一成不变的(出于向后兼容的原因),所以如果您想与所有内容兼容,那么就让所有内容都与此兼容。有些工具可能支持它,有些则可能不支持

    虽然您有一个值得追求的目标,但我认为这将非常难以实现,而且我还发现emacs的regexp很难使用。如果让你更快乐、更高效,也许99%的事情都足够好了?

    一些简单的实现(例如在闪烁/SciTE中)甚至不支持交替或一些量词(?和{})。“非有限决策自动机”。我的电脑只有有限的内存;它是如何容纳一个无限美元的东西的?我想你的意思可能是s/finite/deterministic/g。