Perl Regex替换除字符串中的特定域之外的所有域

时间:2015-04-17 04:41:18

标签: regex perl

我有一个如下所示的域名字符串:

$string = 'https://code.google.com && http://mycode.com/data && times.com && https://thehindu.com';

我想用mycode.com

替换除mycode.com/unknown以外的所有域名

因此应用正则表达式后上面字符串的输出应为:

https://mycode.com/unknown && http://mycode.com/data && mycode.com/unknown && https://mycode.com/unknown

我在下面使用了正则表达式,但它也改变了http://mycode.com/data

$string =~ s/(?<!mycode)[a-z\.]+?\.(com|org|net)/mycode\.com\/unknown/g;

我应该如何修改我的正则表达式以匹配mycode.com

5 个答案:

答案 0 :(得分:4)

$s =~ s{
   ( [a-z.]+\.(?:com|org|net) )
   (?![a-z.])
}{
   $1 eq "mycode.com" ? $1 : "mycode.com/unknown"
}xeg;

$s =~ s{
   (?<![a-z.])
   (?! mycode\.com (?![a-z.]) )
   ([a-z.]+\.(?:com|org|net) (?![a-z.])
}{mycode.com/unknown}xg;

把手

  • mycoder.com
  • mycode.combo.com
  • mycode.combo
  • notmycode.com
  • foo.combo

答案 1 :(得分:1)

你真的关闭了,而不是向后看,使用前瞻:

my $string = 'https://code.google.com && http://mycode.com/data && times.com && https://thehindu.com';
$string =~ s~(?<![a-z.])(?!mycode)[a-z.]+\.(?:com|org|net)~mycode.com/unknown~g;
say $string;

<强>输出:

https://mycode.com/unknown && http://mycode.com/data && mycode.com/unknown && https://mycode.com/unknown

答案 2 :(得分:0)

尝试用以下方法替换正则表达式的匹配部分:

(http:\/\/)?(?!(mycode\.|ycode\.|code\.|ode\.|de\.|e\.))[a-z\.]+?\.(com|org|net)

答案 3 :(得分:0)

请尝试这样的事情

$string =~ s/https?:\/\/([^\/\s]+)/$match=$1;($match!~\/mycode.com\/)?'https:\/\/mycode.com\/unknown':$match/eg;

答案 4 :(得分:-1)

(忽略没有http://...的网址并使用3条非滚动线条)

my $s = 'https://code.google.com && ....' 

$s =~ s!//(?=mycode.com($|[^.\w]))!\cA!g;        # // -> CTR-A
$s =~ s!//(\S+)!//mycode.com/unknown!g;
$s =~ s!\cA!//!g;                                # CTR-A -> //

基本理念:

  • 保护/标记/保存特殊情况
  • 代替一般情况
  • 放回特价