重复的简单正则表达让我难过

Odd*_*Zon 0 regex repeat

问候.

这么简单的问题让我难过.这里的人非常乐于助人.

我正在尝试匹配包含一些固定文本和随机数字的字符串.

echo blah blah abc123 | grep -o abc
abc

echo blah blah abc123 | grep -o abc[0-9]
abc1

echo blah blah abc123 | grep -o abc[0-9]+

echo blah blah abc123 | grep -o "abc[0-9]+"

echo blah blah abc123 | grep -o "abc[0-9]*"
abc123

echo blah blah abc123 | grep -o abc[0-9]{3}

echo blah blah abc123 | grep -o "abc[0-9]{3}"
Run Code Online (Sandbox Code Playgroud)

*运算符(匹配零次或多次)是唯一一个按照我的预期工作的运算符.

为什么+运算符(匹配1次或更多次)不匹配?

为什么特定重复计数运算符{3}不匹配?

我在Ubuntu 10.10下的bash shell中运行这些示例,如果它有所不同的话.

非常感谢.

Mar*_*off 6

当你逃避特殊字符时它们都有效:

$ echo blah blah abc123 | grep -o "abc[0-9]\+"
abc123
$ echo blah blah abc123 | grep -o "abc[0-9]\{3\}"
abc123
Run Code Online (Sandbox Code Playgroud)

未转义,正则表达式正在寻找文字,+或者{正如你所推断的那样.

至于为什么你必须保持一个非*转义,但你必须逃脱+,我不确定.

  • 现在我理解了grep man page的含义"...在基本的正则表达式中,元字符?,+,{,|,(和)失去了它们的特殊含义;而是使用反斜杠的版本\?,\ +,\{,\ |,\\(和\\)" (3认同)
  • 问题是,默认情况下,`grep`使用此(有限)版本的regexen.使用`egrep`或`grep -E`来获得你想要的正则表达式语法. (2认同)