我如何改进我的正则表达式以 grep 三级域但最后不是额外的字符?

How do i improve my regex to grep third level domain but not extra character at last?

这个正则表达式 grep 一切。我怎样才能只 grep 域而不是额外的字符。

echo "AAAA  cccc.google.com BBBB" | grep -oE "[^\.\n]*((\.[^\.\n]*){2}$)"  --color=always 

我希望 cccc.google.com 被 grep 而不是 AAAA cccc.google.com BBBB。添加 \b 不起作用。
echo "AAAA cccc.google.com BBBB" | grep -oE "\b[^\.\n]*((\.[^\.\n]*){2}\b$)\b" --color=always

编辑:我忘了说,我需要 grepping 三级和四级域。这就是我的意思:

我上面的正则表达式是 grepping 三级域,但它 grepping 一些其他字符所以我问了问题。 假设我有 AAAA a.b.c.d.e.g.google.com BBBB 然后 {3} 应该给我 g.google.com 和 {4} 或 {3,4} 应该给我 e.g.google.com 同时省略一些不需要的字符.我的正则表达式正是这样做的,但是有 extra 个字符!

因此,使用此正则表达式(来自答案,已修改):
echo "AAAA d.cccc.google.com BBB" | grep -oE '\w+(\.\w+){2}'
省略了我的正则表达式没有的 .com 部分(但它打印了 exta char :( )。所以,请你修改以在这种情况下工作。

只是 echo "AAAA cccc.google.com BBBB" | grep -oE '\w+(\.\w+)+' --color=always 似乎有效。 \w 或多或少是域名中的预期内容。

看起来 OP 想要一个交互式正则表达式(在评论中阐明),它可以提取 n 个域,其中 n 是可变的。

像这样的东西应该有用- (?:\w+(?:\.|\b)){4}(?=\.\w+(?: |$))\.\w+

查看 demo

用法

  • {2}

    $ echo "AAAA  a.b.c.d.e.g.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){2}(?=\.\w+(?: |$))\.\w+"
    g.google.com
    
    捕获 2 个子域,不包括顶级域(即 com
  • {3}

    $ echo "AAAA  a.b.c.d.e.g.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3}(?=\.\w+(?: |$))\.\w+"
    e.g.google.com
    
    捕获 3 个子域,不包括顶级域(即 com

...等等

说明

(?:\w+(?:\.|\b)){3} <- 这和我原来的答案是一样的,它只是捕获单词字符后跟 .,恰好 3 次

(?=\.\w+(?: |$))\.\w+ <- 这充当前一个正则表达式的停止点。它标志着顶级域的开始并捕获它。

原答案

那个正则表达式似乎完全错误,如果你只想匹配像 cccc.google.comwww.google.com 而不是 google.com 这样的 url,你应该使用 - (?:\w+(?:\.|\b)){3}

查看 demo

说明

主要部分是 \w+(?:\.|\b) - 这匹配紧跟 . 或单词边界(即 space)

的单词字符

这包含在 (?:){3} 中,确保遇到 3 次此类组。

要也 grep 4 级域,只需将 {3} 更改为 {3,4}

(?:\w+(?:\.|\b)){3,4}

查看 demo

这就是你应该如何使用 grep-

$ echo "AAAA  cccc.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3,4}"
cccc.google.com

d.cccc.google.com

$ echo "AAAA  d.cccc.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3,4}"
d.cccc.google.com