尖括号的正则表达式行为

时间:2014-07-08 01:32:35

标签: regex grep

请向我解释为什么以下表达式不会输出任何内容:

echo "<firstname.lastname@domain.com>" | egrep "<lastname@domain.com>"

但以下是:

echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"

第一个的行为是预期的,但第二个不应该输出。是&#34; \&lt;&#34;在正则表达式中被忽略或引起一些其他特殊行为?

1 个答案:

答案 0 :(得分:5)

AS @hwnd说\<匹配单词的开头。 ie字词边界\b必须存在于起始字符之前(输入中\<之后的字符必须是字符),

在您的示例中,

echo "<firstname.lastname@domain.com>" | egrep "<lastname@domain.com>"

在上面的示例中,egrep检查在lastname字符串之前存在的文字<字符。但是没有,所以它什么都不打印。

$ echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"
<firstname.**lastname@domain.com>**

但在此示例中,\b字符串之前存在单词边界lastname,因此它会打印匹配的字符。

更多示例:

$ echo "namelastname@domain.com" | egrep "\<e@domain.com"
$ echo "namelastname@domain.com" | egrep "\<lastname@domain.com"
$ echo "namelastname@domain.com" | egrep "\<com"
namelastname@domain.**com**
$ echo "<firstname.lastname@domain.com>" | egrep "\<@domain.com>"
$ echo "n-ame-lastname@domain.com" | egrep "\<ame-lastname@domain.com"
n-**ame-lastname@domain.com**