使用一对Perl正则表达式匹配的无限循环

jav*_*ity 6 html regex string perl pattern-matching

我用正则表达式编写了一个小的Perl脚本来获取网站的HTML组件.

我知道这不是一种做这种工作的好方法,但我试图测试我的正则表达能力.

当在while循环中使用两个正则表达式模式中的任何一个运行时,它运行完美并显示正确的输出.但是当我尝试检查while循环中的两个模式时,第二个模式每次都匹配,循环无限运行.

我的剧本:

#!/usr/bin/perl -w
use strict;

while (<STDIN>) {

    while ( (m/<span class=\"itempp\">([^<]+)+?<\/span>/g) ||
            (m/<font size=\"-1\">([^<]+)+?<\/font>/g) ) {
        print "$1\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用示例输入测试上面的脚本:

<a href="http://linkTest">Link title</a>
<span class="itempp">$150</span>
<font size="-1"> (Location)</font>
Run Code Online (Sandbox Code Playgroud)

期望的输出:

$150
(Location)
Run Code Online (Sandbox Code Playgroud)

谢谢!任何帮助将非常感谢!

Bor*_*din 9

每当全局正则表达式无法匹配时,它将重置下一个全局正则表达式将开始搜索的位置.因此,当您的两个模式中的第一个失败时,它会强制第二个模式再次从字符串的开头看.

可以通过添加/c修饰符来禁用此行为,如果正则表达式无法匹配,则会保持位置不变.

此外,您可以通过删除转义字符来改进您的模式("不需要转义,/如果选择不同的分隔符则无需转义)和+?捕获后的多余转义.

use warnings-w在命令行上好多了.

这是您的代码的工作版本.

use strict;
use warnings;

while (<STDIN>) {

    while( m|<span class="itempp">([^<]+)</span>|gc
            or m|<font size="-1">([^<]+)</font>|gc ) {
        print "$1\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1实际解释为什么OP的代码失败. (2认同)