2013-03-22 60 views
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; 

我的邏輯是東西點必須是一個或多個字母,而不是aspvbc#之前。

回答

3

您可以使用負面看後面。你幾乎在那裏,但使用LookAheads。

正則表達式:(?<!asp|vb|c\#)\.[a-zA-Z]{2,6}\b 替換什麼

解釋演示在這裏:http://regex101.com/r/tG5rO1

要解決的可變長度的正則表達式的錯誤使用:(?<!asp)(?<!vb|c\#)\.[a-z]{2,6}\b
編輯:針對不同長度的獨立回顧後組排除在外的詞

這隻會找到與您的條件不符的TLD。

更新:

照顧特殊情況:不匹配排除字結尾的詞和匹配的那些字的任意組合(例如,vBVBvbVb

正則表達式:\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 insensitive正則表達式的修飾詞下使用

更新#2

更安全,因爲它只關心.net它TLD和排除的話:

/(^|\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

+0

我得到一個「可變長度回顧後不實施正則表達式..」錯誤:

解釋演示。但是這工作$ company =〜s /(?<!asp)\。[a-zA-Z] {2,6} \ b // g; 。我怎樣才能把多個案例放在lookbehind? – Andy 2013-03-22 19:25:26

+0

更新瞭解決方法變量長度lookbehind – 2013-03-22 19:27:39

+0

爲什麼當我添加更多排除項時,它會給出這個可變長度錯誤。現在這會產生錯誤:$ company =〜s /(?<!asp)(?<!vb | c \#| basic)\ [a-zA-Z] {2,6} \ b // gi; – Andy 2013-03-22 19:44:11

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

要投入模式多少工作依賴於存在多少變化你的意見。以上示例基於您提供的示例輸入。