请解释为什么以下表达式不输出任何内容:
echo "<firstname.lastname@domain.com>" | egrep "<lastname@domain.com>"
Run Code Online (Sandbox Code Playgroud)
但以下是:
echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"
Run Code Online (Sandbox Code Playgroud)
第一个的行为是预期的,但第二个不应该输出.在正则表达式中是否会忽略"\ <"或导致其他一些特殊行为?
AS @hwnd说\<匹配这个词的开头.ie字边界\b必须(存在起始字字符前后的字符\<在输入必须是字字符),
在你的例子中,
echo "<firstname.lastname@domain.com>" | egrep "<lastname@domain.com>"
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,egrep检查<在lastname字符串之前存在的文字字符.但没有,所以它什么都不打印.
$ echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"
<firstname.**lastname@domain.com>**
Run Code Online (Sandbox Code Playgroud)
但在此示例中,字符边界\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**
Run Code Online (Sandbox Code Playgroud)