正则表达式在 Perl 中不匹配

标签 regex perl pattern-matching

我将使用此脚本提取一些抓取数据的名称和 ID:

if ( $string =~ m/(;r=\d*.*<)/ ) {

    $mystring = $1;
    $mystring =~ s/;//;

    if ( $mystring =~ m/(>.*<)/ ) {

        $mystring = $1;
        $mystring =~ s/>//;
        $mystring =~ s/<//;

        print "$mystring \n";
    }
}

其中$string每次迭代包含输入文件的一行。以下是一些行:

<pre>
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959195" >ZAN 3713</option>
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959194" >ZAN2310</option>
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959193" >ZAN2410</option>

我通常期望的是 ;r=4294959193" >ZAN2410<作为结果;但问题是 Perl 没有检测到任何匹配! 我的正则表达式有问题吗?

最佳答案

是的,可能有。但老实说,我可能会采取不同的方式来解决这个问题。使用 HTML 解析器是第一个途径。

例如 - 您正在重复使用 $mystring,这通常是一个警告信号,表明您没有使用 strict警告,因此正在做您不期望的事情。

您没有得到您想要的输出,因为您用此位覆盖了 $mystring,例如:

    if($mystring =~ m/(>.*<)/){
        $mystring = $1;

但是使用示例数据运行代码后 - 看起来几乎可以工作 - 因为你正在破坏 $mystring 你得到:

ZAN 3713 
ZAN2310 
ZAN2410 

不过我建议采用稍微不同的方法:

while (<DATA>) {
    m/r=(\d+)\"\s*>([^<]+)/g && print "$1 $2\n";
}

__DATA__
<pre>
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959195" >ZAN 3713</option>
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959194" >ZAN2310</option>
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959193" >ZAN2410</option>

这将为您提供以下输出:

4294959195 ZAN 3713
4294959194 ZAN2310
4294959193 ZAN2410

关于正则表达式在 Perl 中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35989809/

相关文章:

c++ - 为什么我无法构建此正则表达式

multithreading - Perl 在线程中死掉(并停止整个程序)

xml - Perl 探查器中断对 XML 解析器的调用

Scala Map 模式匹配

c++ - std::regex_constants::optimize 使用的优化技术

c# - 用于匹配仅包含数字而不包含字母的字符串的正则表达式

javascript - 在最后一个符号 "/"或 "\"之后获取字符串片段

perl - 如何使用 Perl 以字节数组形式读取图像?

scala - 为什么 Scala 不能将此匹配优化为开关?

python - 如何在两个字符串之间进行模式匹配?