使用正则表达式获取最后一次出现的字符串

时间:2010-02-07 20:28:15

标签: html regex last-occurrence

我需要解析一个HTML文件,我有这样的东西:

<TAG1>
    <TAG1>
        TEXT_TO_FIND
        KEY
        <TAG1>
        </TAG1>
        <TAG1>
        </TAG1>
    </TAG1>
</TAG1>

考虑到有多个级别的anidation。如何获取文本TEXT_TO_FIND?

用简单的英语,我需要做的是在“最后有文本KEY之后”和“文本KEY”之间获取文本,文本只出现在文档上。

注1:我发现了question,但它似乎没有用;我一直得到一个空洞的结果。这将是表达式:

/<TAG1>(?!.*<TAG1>)(.*)KEY/ism

注意2:如果我从前一个音符的表达式中删除了KEY,我会从文件的最后一个到结尾处获得文本。

提前感谢大家!

3 个答案:

答案 0 :(得分:1)

  

你好!我需要解析一个HTML文件,我有这样的东西:

然后你需要一个HTML解析器。正则表达式不够强大,无法正确执行。

一旦解析了HTML并获得了每个TAG的内容,就可以使用以下内容:

/(.*)KEY/is

检查文本是否包含KEY,如果是,请抓取其前面的内容。

答案 1 :(得分:0)

如果您只是不想使用HTML解析器,那么这是一个正则表达式,如果TEXT_TO_FIND不包含“&lt;”或“&gt;”:

/\s*([^<>]*?)\s*?KEY/ism

答案 2 :(得分:0)

在适当的上下文中使用每个工具:使用HTML解析器查找文本块,然后匹配具有正则表达式的文本块。

#! /usr/bin/perl

use warnings;
use strict;

use HTML::Parser;

my $p = HTML::Parser->new(
  api_version => 3,
  text_h => [
    sub {
      local($_) = @_;
      print $1, "\n" if /(\S.+?)\s*\bKEY\b/s;
    },
    "dtext"
  ],
);

# for demo only
*ARGV = *DATA;

undef $/;
$p->parse(<>);

__DATA__
<TAG1>
    <TAG1>
        TEXT_TO_FIND
        KEY
        <TAG1>
        </TAG1>
        <TAG1>
        </TAG1>
    </TAG1>
</TAG1>

输出:

$ ./find-text
TEXT_TO_FIND