所有正则表达口味的共同特征?

时间:2008-08-27 13:05:39

标签: regex language-agnostic

我已经看到了不同正则表达式工具/语言(例如perl,sed,java,vim等)的正则表达式功能的很多共性,但我也有很多差异。

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

6 个答案:

答案 0 :(得分:12)

答案 1 :(得分:12)

答案 2 :(得分:1)

如果您使用了grep regexp语法,而不是egrep语法或sed regexp语法并使用了它,那么您应该在许多平台和工具中使用安全子集。

关于你可能会咬你的唯一一件事就是你在使用有限状态自动机(FSA)的正则表达式实现与使用回溯的正则表达式之间进行转换,例如:量词实现将从grep到Perl不等。

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

考虑字符串"xyxyxyzz"和模式"(xy)*(xyz)?"。基于FSA的引擎将匹配最长的子字符串"xyxyxyz"。基于反向跟踪的引擎将匹配左偏的第一个子字符串"xyxyxy"

答案 3 :(得分:1)

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

  1. 字符类/集及其否定 - []
  2. 主播 - ^ $
  3. 轮换 - |
  4. 量词 - ?+ * {n,m}
  5. 元字符 - \ w,\ s,\ d,...
  6. 反向引用 - \ 1,\ 2,...
  7. Dot - 。
  8. 简单的修饰符,如/ g和/ i,用于全局和忽略大小写
  9. 转义字符
  10. 更高级的工具/语言支持:

    1. Lookaheads and behinds
    2. POSIX字符类
    3. 字边界
    4. 内联开关,例如仅对正则表达式的一小部分允许不区分大小写
    5. 像/ x这样的修饰符允许额外的格式和注释,/ m用于多行
    6. 名为Captures
    7. 的Unicode

答案 4 :(得分:0)

没有标准引擎。但是,POSIX扩展正则表达式格式是大多数引擎的有效子集,可能与您获得标准化子集的距离非常接近。

答案 5 :(得分:0)

请参阅emacs的正则​​表达式语法:http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps

我记得读过emacs的语法是一成不变的(出于向后兼容的原因),所以如果你想与所有东西兼容,那就让所有东西都与之兼容。有些工具可能会支持它,有些则可能不支持。

虽然你有一个有价值的目标,但我觉得要达到这个目标非常困难,而且我也发现emacs的regexps很难实现。也许99%的一切都足够好,如果它让你更快乐,更富有成效?