带尖括号的正则表达式行为

标签 regex grep

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

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

但以下是:
echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"

第一个的行为符合预期,但第二个不应该输出。 “\<”在正则表达式中是否被忽略或导致一些其他特殊行为?

最佳答案

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

在你的例子中,

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

在上面的例子中,egrep 检查文字 <姓氏字符串之前的字符。但没有,所以它什么也不打印。
$ 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**

关于带尖括号的正则表达式行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24622402/

相关文章:

bash - 使用 grep 查找版本号

JavaScript 正则表达式 - 检查数字匹配的数量

php - MySQL正则表达式按顺序匹配包含某些字段的多个CSV行

python - 如何在不同的分隔符上拆分字符串,但保留某些所述分隔符的输出? (标记字符串)

html - 从 Perl 中的 HTMl/XML 标签中提取文本

java - 通过定义正则表达式过滤日志文件

bash - 从 mysqldump 输出中删除特定表的插入数据(sed?)

linux - 使用 bash 替换文件中文本的正确方法

regex - 将变量添加到正则表达式

git - 当我在子目录中时,如何在整个树中进行 git grep?