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

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

有帮助吗?

解决方案

其他提示

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

  1. 字符类/字符集及其否定 - []
  2. 锚点 - ^$
  3. 交替 - |
  4. 量词 - ?+*{n,m}
  5. 元字符 - \w、\s、\d、...
  6. 反向引用 - \1、\2、...
  7. 点-.
  8. 简单的修饰符,例如 /g 和 /i 用于全局并忽略大小写
  9. 转义字符

更高级的工具/语言支持:

  1. 前瞻和后瞻
  2. POSIX 字符类
  3. 单词边界
  4. 内联开关例如仅允许正则表达式的一小部分不区分大小写
  5. /x 等修饰符允许额外的格式和注释,/m 表示多行
  6. 命名捕获
  7. 统一码

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

唯一可能让你感到困扰的是当你在使用有限状态自动机(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% 的事情只要能让你更快乐、更有效率就足够好了?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top