代码之家  ›  专栏  ›  技术社区  ›  Kev Hunter

使用Lookahead使用正则表达式匹配字符串

  •  1
  • Kev Hunter  · 技术社区  · 17 年前

    我需要使用正则表达式匹配一个字符串打孔html来提取所有嵌套的跨距,我假设有一种方法可以使用正则表达式来实现这一点,但整个上午都没有成功。

    <DIV id=c445c9c2-a02e-4cec-b254-c134adfa4192 style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; BACKGROUND-COLOR: #eeeeee">
    <SPAN id=b8db8cd1-f600-448f-be26-2aa56ea09a9c>
    <SPAN id=304ccd38-8161-4def-a557-1a048c963df4>
    <IMG src="http://avis.co.uk/Assets/build/menu.gif">
    </SPAN>
    </SPAN>
    <SPAN id=bc88c866-5370-4c72-990b-06fbe22038d5>
    <SPAN id=55b88bbe-15ca-49c9-ad96-cecc6ca7004e>UK<BR></SPAN>
    </SPAN>
    <SPAN id=52bb62ca-8f0a-42f1-a13b-9b263225ff1d>
    <SPAN id=0e1c3eb6-046d-4f07-96c1-d1ac099d5f1c>
    <IMG src="http://avis.co.uk/Assets/build/menu.gif">
    </SPAN>
    </SPAN>
    <SPAN id=4c29eef2-cd77-4d33-9828-e442685a25cb>
    <SPAN id=0d5a266a-14ae-4a89-9263-9e0ab57f7ad2>Italy</SPAN>
    </SPAN>
    <SPAN id=f0a72eea-fddd-471e-89e6-56e9b9efbece>
    <SPAN id=b7d9ada7-ade0-49fe-aa5f-270237e87c2b>
    <IMG src="http://avis.co.uk/Assets/build/menu.gif">
    </SPAN>
    </SPAN>
    <SPAN id=7604df94-34ba-4c89-bf11-125df01731ff>
    <SPAN id=330d6429-4f1b-46a2-a485-9001e2c6b8c1>Netherlands</SPAN>
    </SPAN>
    <SPAN id=a18fb516-451e-4c32-ab31-3e3be29235f6>
    <SPAN id=6c70238d-78f9-468f-bb8d-370fff13c909>
    <IMG src="http://avis.co.uk/Assets/build/menu.gif">
    </SPAN>
    </SPAN>
    <SPAN id=5a2465eb-b337-4f94-a4f8-6f5001dfbd75>
    <SPAN id=47877a9e-a7d5-4f13-a41e-6948f899e385>Malta &amp; Gozo
    

    我想得到每个外部跨距及其包含的跨距,所以在上面的文本中应该有八个结果

    乐意接受任何帮助

    4 回复  |  直到 17 年前
        1
  •  5
  •   annakata    17 年前
        2
  •  4
  •   Michael Borgwardt    17 年前

    使用标准正则表达式实际上不可能解决这个问题,因为它们基本上在 Chomsky hierarchy

    然而,如果您限制最大可能的嵌套级别,那么这可能是可能的,但我仍然怀疑regexp是否是最佳解决方案。

        3
  •  1
  •   Alan Moore Chris Ballance    17 年前

    @"(?is)<SPAN\b[^>]*>\s*(<SPAN\b[^>]*>.*?</SPAN>)\s*</SPAN>"
    

        4
  •  0
  •   PhiLho    17 年前

    基本上,我同意上面的建议,使用正则表达式解析HTML就是要求有一天在奇怪的合法HTML结构上破译代码(更不用说浏览器接受的格式错误的HTML…)。找到并使用一个好的HTML解析器在很多方面都是有益的。。。

    在您的例子中,HTML是非常规则、线性和可预测的,因此RE非常简单。我之所以给出Java代码,是因为我不懂C语言,但适应应该很简单。

    Pattern p = Pattern.compile("(<SPAN id.*?<SPAN id.*?</SPAN></SPAN>)");
    Matcher m = p.matcher(html);
    while (m.find())
    {
      System.out.println(m.group(1));
    }