regex - 继续在 perl 中换行

标签 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";
}

这对重定向 squid(一行)有效,但如果像这样更改为多行,则绝对无效。

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

有什么建议吗? - 谢谢

最佳答案

您对转义符和圆括号有点着迷了!将分隔符更改为 {...} 之类的东西要简单得多,它不在模式的主体中;那么你不必转义斜杠

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

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

而且不需要一次性的.*来匹配字符串的尾部,除非你需要匹配并捕获它以供进一步使用

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

并且在双引号字符串中根本不需要反斜杠,除非您想添加特殊字符,例如 \t 用于制表符,\n 用于换行符等。

这段代码应该做你想做的

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

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

关于regex - 继续在 perl 中换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230896/

相关文章:

perl - 强制 Time::Piece strftime 使用特定的语言环境

perl - 一次处理一封邮件

正则表达式 - 带有空格和特殊字符

c++ - 仅在捕获组的最后一次出现时使字符可选

c# - 如何将字符串中单词之间的每个数字作为单独的值进行替换

javascript - 匹配直到字符的未转义版本

用于匹配任何 URL 字符的正则表达式

perl - 如何在不丢失颜色的情况下从 Perl 中的终端进行管道传输?

arrays - Perl 按散列数组或散列散列中的散列值排序

perl - 如何从 PDF 文件中提取页面?