我如何改进我的正则表达式以 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 三级和四级域。这就是我的意思:
g.google.com
这是三级域名
a.b.google.com
这是一个 4 级域。
我上面的正则表达式是 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.com
和 www.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
这个正则表达式 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 三级和四级域。这就是我的意思:
g.google.com
这是三级域名a.b.google.com
这是一个 4 级域。
我上面的正则表达式是 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}
捕获 2 个子域,不包括顶级域(即$ echo "AAAA a.b.c.d.e.g.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){2}(?=\.\w+(?: |$))\.\w+" g.google.com
com
)和
{3}
捕获 3 个子域,不包括顶级域(即$ echo "AAAA a.b.c.d.e.g.google.com BBB" | grep -oP "(?:\w+(?:\.|\b)){3}(?=\.\w+(?: |$))\.\w+" e.g.google.com
com
)
...等等
说明
(?:\w+(?:\.|\b)){3}
<- 这和我原来的答案是一样的,它只是捕获单词字符后跟 .
,恰好 3 次
(?=\.\w+(?: |$))\.\w+
<- 这充当前一个正则表达式的停止点。它标志着顶级域的开始并捕获它。
原答案
那个正则表达式似乎完全错误,如果你只想匹配像 cccc.google.com
和 www.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