我有一个存储在.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
有人可以帮帮我吗?
答案 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
可能更好。