题
我已经看到不同支持正则表达式的工具/语言的正则表达式功能有很多共性(例如perl、sed、java、vim 等),但我也有很多差异。
有没有 标准 所有支持正则表达式的工具/语言都支持正则表达式功能的子集?不同工具/语言之间的正则表达式功能有何不同?
解决方案
其他提示
大多数正则表达式工具/语言都支持这些 基本能力:
- 字符类/字符集及其否定 - []
- 锚点 - ^$
- 交替 - |
- 量词 - ?+*{n,m}
- 元字符 - \w、\s、\d、...
- 反向引用 - \1、\2、...
- 点-.
- 简单的修饰符,例如 /g 和 /i 用于全局并忽略大小写
- 转义字符
更高级的工具/语言支持:
- 前瞻和后瞻
- POSIX 字符类
- 单词边界
- 内联开关例如仅允许正则表达式的一小部分不区分大小写
- /x 等修饰符允许额外的格式和注释,/m 表示多行
- 命名捕获
- 统一码
如果您采用 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% 的事情只要能让你更快乐、更有效率就足够好了?