在正则表达式中排除模式搜索和替换

时间:2013-03-22 18:53:27

标签: regex perl

我有这个字符串

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而不是aspvbc#的东西。

2 个答案:

答案 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

需要更换,而不是以前的变种。

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

答案 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";

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