1

我有这个字符串

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 而不是aspor vbor之前的东西c#

4

2 回答 2

3

您可以使用 Negative LookBehind。你几乎在那里,但使用 LookAheads。

正则表达式:(?<!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 Vb

RegExp:\b(?<!\b[aA][sS][pP])(?<!\b[vV][bB]|\b[cC]\#)\.[a-zA-Z]{2,6}\b 解释演示:http ://regex101.com/r/bR3kJ8

或:\b(?<!\basp)(?<!\bvb|\bc\#)\.[a-z]{2,6}\b
case insensitiveRegEx 修饰符i一起使用时

更新#2

更安全,因为它只关心.netTLD 并为其排除了单词:

/(^|\s)(?!(?:visual)?(?:basic|studio|asp|v[bs]|c\#)\.net)(\w+)(?:\.com?\.[a-z]{2}|\.[a-z]{2,6})\b/\1\2/gi

与以前的变体相比,需要更换。

解释演示:http ://regex101.com/r/kL5mQ5

于 2013-03-22T19:03:35.217 回答
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";

您想在模式中投入多少工作取决于您的输入有多少变化。以上示例基于您提供的示例输入。

于 2013-03-22T19:02:14.323 回答