10

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

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

4

6 回答 6

12

比较正则表达式风格

http://www.regular-expressions.info/refflavors.html

于 2008-08-27T13:08:30.010 回答
1

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

唯一可能让您感到困扰的事情是,当您在使用有限状态自动机 (FSA) 的正则表达式实现和使用回溯的实现之间切换时,例如量词的实现会从 grep 到 Perl 有所不同。

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

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

于 2008-08-27T13:14:23.897 回答
1

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

  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. 统一码
于 2008-08-27T13:15:30.370 回答
0

没有标准引擎。但是,POSIX 扩展正则表达式格式是大多数引擎的有效子集,并且可能与您将获得的标准化子集一样接近。

于 2008-08-27T13:17:22.953 回答
0

查看 emacs 的正则表达式语法:http ://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps 。

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

虽然你有一个有价值的目标,但我认为它很难实现,而且我还发现使用 emacs 的正则表达式很痛苦。如果它能让你更快乐、更有效率,也许 99% 的事情就足够了?

于 2009-05-18T13:47:50.857 回答