问题:需要获取字符串中的所有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;
答案 0 :(得分:4)
唉。用正则表达式解析HTML =坏,坏想法。
无论如何,你的正则表达式是贪婪的,所以"<h3 class=.*><a class=.*>"
部分从你的第一个标签到第二个标签一直匹配。你需要通过第一个“&gt;”来吞噬东西那是受欢迎的,所以试试像"<h3 class="[^>]*><a class="[^>]*>([a-zA-Z0-9а-яА-Я]+)</a></h3>"
这样的东西。 (您也可以使用惰性量词,例如“。+?”而不是“。*”,但这比使用否定选项要慢。)
请注意,这将无法正确处理“&gt;”嵌入在引用属性中 - 为此,您需要更加努力地工作。
<h3\sclass=.+?><a\sclass=.+?>([a-zA-Z0-9а-яА-Я]+)</a></h3>
(“\ s”是空白字符 - 在大多数正则表达式解析器上更可靠。)真的,通过XML解析器运行它会好得多。