我有这个字符串
asp.net somedomain.com
我需要删除域点扩展部分,除非在某些情况下。所以我想要这个:
asp.net somedomain
任何时候都有vb.net,asp.net等。我不想删除扩展名。
我在perl中试过这个没有效果。
$company =~ s/(?=\w+)(?!=asp|vb|c#)\.[a-zA-Z]{2,6}\b/\1/g;
我的逻辑是点之前必须是一个或多个alpha而不是asp
或vb
或c#
的东西。
答案 0 :(得分:3)
您可以使用Negative LookBehind。你几乎就在那里,但使用LookAheads。
RegExp:(?<!asp|vb|c\#)\.[a-zA-Z]{2,6}\b
什么都不用替换
在此解释演示:http://regex101.com/r/tG5rO1
要解决可变长度RegEx错误,请使用以下代码:(?<!asp)(?<!vb|c\#)\.[a-z]{2,6}\b
编辑:单独的LookBehind组,用于不同长度的排除词
这只会找到与您的标准不符的TLD。
<强>更新强>
要处理特殊情况:请勿匹配以排除字词结尾的单词并匹配排除单词的任意组合(例如vB
VB
vb
{{1 }})
RegExp:Vb
解释演示:http://regex101.com/r/bR3kJ8
或者:\b(?<!\b[aA][sS][pP])(?<!\b[vV][bB]|\b[cC]\#)\.[a-zA-Z]{2,6}\b
与\b(?<!\basp)(?<!\bvb|\bc\#)\.[a-z]{2,6}\b
RegEx修饰符 i
更新#2
更安全,因为它只关心case insensitive
TLD并为其排除了字词:
.net
需要更换,而不是以前的变种。
答案 1 :(得分:1)
只匹配最后一个:
my $s = q{asp.net somedomain.com};
my ($company) = ($s =~ / ([A-Za-z]{2,}) [.] (?:[A-Za-z]{2,}) \z /x);
print $company, "\n";
或者,空格和点上的split
:
my $s = q{asp.net somedomain.com};
my ($company) = split /[.]/, (split ' ', $s)[-1];
print $company, "\n";
您想要在模式中投入多少工作取决于您的输入中有多少变化。以上示例基于您提供的示例输入。