在perl中继续换行

时间:2015-07-05 13:33:31

标签: regex perl

我有这样的perl脚本:

elsif ($url =~ m/^(http|https):\/\/(banner(s?)|advertising|iklan|adsbox|adserver|adservice(s?))\.(.*)/) {
        print "http:\/\/ip\.mdm\-lo\-00\.willsz\.net/null\.png\n";
}

用于重定向鱿鱼(一行),但如果更改为这样的多行,绝对不能正常工作。

elsif ($url =~ m/^(http|https):\/\/(banner(s?) \
 |advertising \
 |iklan \
 |adsbox \
 |adserver \
 |adservice(s?))\.(.*)/) {
    print "http:\/\/ip\.mdm\-lo\-00\.willsz\.net/null\.png\n";
}

有什么建议吗? - 谢谢

2 个答案:

答案 0 :(得分:5)

你的逃脱和括号让你有点失望!将分隔符更改为不在模式正文中的{ ... }更为简单;那么你不必逃避斜杠

除非你使用/x修饰符,否则所有空格在正则表达式模式中都很重要,包括换行符,并且转义它们根本没有任何区别。这不是C!

除非需要捕获匹配模式的子串,否则还应使用非(?:...)等非捕获括号

除非您需要匹配并捕获它以供进一步使用,否则不需要抛弃.*来匹配字符串的尾部

您最好的选择是使用m{...}x。然后,您可以根据需要添加空格,制表符和换行符,以使模式更清晰

根本不需要双引号字符串中的反斜杠,除非你想为tab添加\t之类的特殊字符,为换行添加\n等。

此代码应该按您的要求执行

elsif ( $url =~ m{ ^ https?:// (?:
        banners?    |
        advertising |
        iklan       |
        adsbox      |
        adserver    |
        adservices? ) \. }x ) {

    print "http://ip.mdm-lo-00.willsz.net/null.png\n";
}

答案 1 :(得分:1)

if ($url =~ m{
    ^(?:http|https)://(?:banners?|
    advertising|
    iklan|
    adsbox|
    adserver|
    adservices?)\.
}x #<---- x for multi line regex
){
    print "http://ip.mdm-lo-00.willsz.net/null.png\n";
}