Perl 5正则表达式匹配所有非html标签,没有可变长度的lookbehind

时间:2014-01-21 03:56:11

标签: regex perl

所以我试图解析所有非html-tag匹配的网页。我正在使用RegExr,他们的一个样本模式完美地满足了我的需求。唯一的问题是我使用的是Perl 5并且它不断吐出这个错误:

Variable length lookbehind not implemented in regex m/((?<=^|>)[^><]+?(?=<|$))/ at POODLE_calc.pl line 36.

我在这里阅读了很多关于此错误的其他帖子,但仍然无法让它工作!我尝试过多次尝试重写模式,就像我在谷歌上想到的那样,或者在其中一个stackoverflow帖子中尝试了K,但仍然无效。

这是我在RegExr中试验的HTML页面的摘录(整页让它崩溃)

<TABLE border cellspacing="2">
    <TR align="center">
        <TD width="50"> no. </TD> 
        <TD width="50"> AA </TD> 
        <TD width="50"> ORD/DIS </TD> 
        <TD width="50"> Prob. </TD> 
    </TR>
    <tr align="center">
        <td> 1 </td>
        <td> M </td>
        <td> -1 </td>
        <td> 0.1029 </td>
    </tr>

如果你能帮我弄清楚一个模式会给我“没有.AO ORD / DIS Prob.1 M -1 0.1029”,Perl会接受我会非常感激!

谢谢,
霍比特

修改

我使用了ikegami建议的模式并且它停止了Perl错误,但它只返回“否”。和所有空格字符。 以下是进行解析的代码:

while (<FILE>){
    $_ =~ /((?:^|(?<=>))[^><]+?(?=<|$))/g;
    $proteinScores .= $1;
}
print $proteinScores."\n";

2 个答案:

答案 0 :(得分:1)

(?<=^|>)可以写成(?:(?<=^)|(?<=>)),简化为(?:^|(?<=>))

答案 1 :(得分:1)

这可以有所帮助,假设没有文本跨越行和每行单个文本:

while (<DATA>){
    $proteinScores .= $1 if />([^>]+)</;
}

这一行每行可以做多个文本:

while (<DATA>){
    $proteinScores .= $1 while />([^>]+)</g;
}

这个可以处理跨越文本:

$text = join("", <DATA>);
$proteinScores .= $1 while $text =~ />([^<>]+)</g;