2012-07-17 227 views
-1

问题:需要得到一个字符串中的所有st。这样做,但在备忘录中只添加最后的结果,即st2。我如何获得st和st2等?德尔福:TRegExpr

const 
    pattern = '<h3 class=.*><a class=.*>([a-zA-Z0-9а-яА-Я]+)</a></h3>'; 
var 
    r: TRegExpr; 
    s: string; 
begin 
r:=TRegExpr.Create; 
s:='<h3 class="yt-lockup-ellipsize"><a class="yt-uix-sessionlink yt-uix-tile-link result-item-translation-title"dir="ltr"title="Женщины"data-sessionlink="ei=CO_0s_S3oLECFQQZ3wodxl5sKw%3D%3D"href="/watch?v=E0MzksPjObU">st1</a></h3>'; 
s:=s + '<h3 class="yt-lockup-ellipsize"><a class="yt-uix-sessionlink yt-uix-tile-link result-item-translation-title"dir="ltr"title="Женщины"data-sessionlink="ei=CO_0s_S3oLECFQQZ3wodxl5sKw%3D%3D"href="/watch?v=E0MzksPjObU">st2</a></h3>'; 
r.Expression:=pattern; 
if r.Exec(s) then 
    REPEAT 
    Memo2.Lines.Add(r.Match[1]); 
    UNTIL not r.ExecNext; 

回答

4

呃。用正则表达式解析HTML =坏,不好想法。

不管怎样,你的正则表达式是贪婪的,所以"<h3 class=.*><a class=.*>"部分匹配从你的第一个标签到第二个标签。你只需要通过第一个“>”击中东西,所以尝试像"<h3 class="[^>]*><a class="[^>]*>([a-zA-Z0-9а-яА-Я]+)</a></h3>"。 (您也可以使用惰性量词,例如“。+?”而不是“。*”,但这比使用否定选项慢)。

请注意,这将无法正确处理嵌入的“>”在一个被引用的属性 - 为此,你需要更加努力工作。

  • 编辑:仅供参考,这里的懒惰量词版本:<h3\sclass=.+?><a\sclass=.+?>([a-zA-Z0-9а-яА-Я]+)</a></h3>(以下简称“\ s”为空白字符 - 多少上最正则表达式更可靠的解析器)。

真的,你通过XML解析器运行这个好得多。

+0

谢谢。为什么不好主意?这是一个好主意吗? :) – dedoki 2012-07-17 20:08:13

+2

一般来说,HTML不是常规语言,因此正则表达式无法捕获所有可能的HTML编写方式(不包括结束标签等 - 这也会导致XML解析失败)。我从最近的经验谈到:我的基于正则表达式的小型HTML解析器未能跳过注释掉的HTML。哑。 C.f.,http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html一个有趣的拍摄。 此外,可以将HTML提供给基于正则表达式的解决方案,该解决方案可以完全锁定解析器。 如果你有一个定义良好的域名,你可能确定。只要小心不可信的输入。 – 2012-07-17 20:15:52

+2

只要好的想法去...如果我不得不做任何事情,除了最简单的HTML解析,我会使用Delphi的Python来呼吁BeautifulSoup,这只是HTML解析器的试金石。 – 2012-07-17 20:17:24