正则表达式从列表中的根域中删除子域 - Notepad ++或Gvim

时间:2011-06-22 01:06:56

标签: regex vim notepad++

我有一个存储在.txt文件中的网址列表(我使用的是Windows 7)。

网址的格式为:

somesite1.com
somesite2.com
somesite3.com
sub1.somesite3.com
sub2.somesite3.com
sub3.somesite3.com
sub1.somesite3.net
sub1.somesite1.org

在notepad ++中,有一个选项可以使用“find-replace with regular expressions”,我很确定gvim允许正则表达式的用户使用(虽然我不完全确定如何在Gvim中使用它们)

无论如何,我不知道在发现和放置什么?替换框,以便它可以浏览文件的内容,只留下根域。如果操作正确,它会将上面的示例列表转换为:

somesite1.com
somesite2.com
somesite3.com
somesite3.com
somesite3.com
somesite3.com
somesite3.net
somesite1.org

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:4)

为Vim做的几种方法(尾部斜杠也是可选的):

:%s/^.\+\.\ze[^.]\+\.[^.]\+$//
:%s/^.\+\.\([^.]\+\.[^.]\+\)$/\1/

另请参阅:help /\ze等。\ze\zs是特定于Vim的,非常有用。在Vim和PCRE中还有前瞻和后视断言,这些断言很有用。

我相信Notepad ++使用PCRE;找到^.+\.([^.]+\.[^.]+)$并将其替换为\1应该有效(但我不使用Notepad ++)。

请注意,对于使用第三级注册的国家/地区代码顶级域名,这将无效,example.com.au将转为com.au。然后有一些国家在某些规则下使用second- 三级注册......如果你关心这些情况,你需要更多的规则,而且完整的解析器比一个更整洁正则表达式(虽然一如既往可以使用正则表达式)。

答案 1 :(得分:1)

^[^.]*\.(?=\w+\.\w+$)替换为<blank>

解密,这意味着:

  • ^ =行首
  • [^.]* =任意数量的不是点的字符
  • \. =一个点
  • (?=[^.]+\.[^.]+$) =必须有一个字,一个点,然后一个字从这里到最后

已编辑 - 添加了另一个点

再次编辑 - 改为预测单词之间的一个点

答案 2 :(得分:0)

将整行替换为最后一个单词和前一个单词。

%s/^.*\.\(\w\+\.\w\+\)$/\1/g

请注意,vim需要\() + \+

更新:

%s/^.*\.\([0-9a-z\-]\+\.[0-9a-z\-]\+\)$/\1/g

可能更好。