-1

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

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

1 回答 1

3

啊。使用正则表达式解析 HTML =主意。

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

请注意,这将无法正确处理嵌入在带引号的属性中的“>”——为此,您需要更加努力。

  • 编辑:仅供参考,这是惰性量词版本:(<h3\sclass=.+?><a\sclass=.+?>([a-zA-Z0-9а-яА-Я]+)</a></h3>“\s”是空格字符——在大多数正则表达式中更可靠。解析器)。

确实,最好通过 XML 解析器运行它。

于 2012-07-17T19:37:43.627 回答