我有一个如下所示的域名字符串:
$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
答案 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 -> //
基本理念: