正则表达式:加号与星号

时间:2013-08-21 18:06:29

标签: regex grep

星号或星号告诉引擎尝试将前一个标记匹配零次或多次。加号告诉引擎尝试匹配前一个令牌一次或多次。

根据定义,我想知道为什么加号会返回比星号更多的匹配。

 echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]+"

返回

ABC DDD

 echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]*"

返回 ABC

1 个答案:

答案 0 :(得分:4)

据我所知,事实并非如此。使用GNU grep版本2.5.3,2.6.3,2.10和2.12,我得到:

$ echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]+"
ABC
DDD
$ echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]*"
ABC
DDD

请仔细检查你的第二个例子。如果您确认只获得一行输出,则可能是grep中的错误。如果您使用的是GNU grep,那么grep --version的输出是什么?如果没有,你使用什么操作系统,以及(如果你知道)grep实施什么?

更新:

我刚从源代码构建并安装了GNU grep 2.5.1(你正在使用的版本),我确认你的输出。它似乎是grep版本中的一个错误,显然在2.5.1a和2.5.3之间纠正。 GNU grep 2.5.1大约12岁;你能安装更新的版本吗?通过ChangeLog查看2.5.3,我怀疑这可能是修复:

2005-08-24  Charles Levert  <charles_levert@gna.org>

    * src/grep.c (print_line_middle): In case of an empty match,
      make minimal progress and continue instead of aborting process
      of the remainder of the line, in case there's still an upcoming
      non-empty match.
    * tests/foad1.sh: Add two tests for this.
    * doc/grep.texi, doc/grep.1: Document this behavior, since
      --only-matching and --color are GNU extensions which are
      otherwise unspecified by POSIX or other standards.

即使您没有对正在使用的计算机拥有完全访问权限,您仍然可以从ftp://ftp.gnu.org/gnu/grep/下载源tarball并将其安装在您的主目录下(假设您的系统正常运行)编译器和相关工具)。