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)
谢谢!任何帮助将非常感谢!
每当全局正则表达式无法匹配时,它将重置下一个全局正则表达式将开始搜索的位置.因此,当您的两个模式中的第一个失败时,它会强制第二个模式再次从字符串的开头看.
可以通过添加/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)