У меня есть эти строки в потоке строк:
"do=whoposted&t=1934067" rel=nofollow>61</A></TD><TD class=alt2 align=middle>5,286</TD></TR><TR><TD id=td_threadstatusicon_1911046 class=alt1><IMG id=thread_statusicon_1911046 border=0 alt="" src="http://url.com/forum/images/statusicon/thread_new.gif"> </TD><TD class=alt2><IMG title=Film border=0 alt=Film src="http://url.com/forum/images/icons/new.png"></TD><TD id=td_threadtitle_1911046 class=alt1 title="http://lulzimg.com/i14/7bd11b.jpg Complete name : cool-thread.."><DIV><A id=thread_gotonew_1911046 href="http://url.com/forum/f80/cool-topic-new/"><IMG class=inlineimg title="Go to first new post" border=0 alt="Go to first new post" src="http://url.com/forum/images/buttons/firstnew.gif"></A> [MULTI] <A style="FONT-WEIGHT: bold" id=thread_title_1911046 href="http://url.com/forum/f80/cool-topic-name-1911046/">Cool Topic Name</A> </DIV><DIV class=smallfont><SPAN style="CURSOR: pointer" onclick="window.open('http://url.com/forum/members/u2031889/', '_self')">m3no</SPAN> </DIV></TD><TD class=alt2 title="Replies: 11, Views: 1,554"><DIV style="TEXT-ALIGN: right; WHITE-SPACE: nowrap" class=smallfont>Today <SPAN class=time>08:04 AM</SPAN><BR>by <A href="http://url.com/forum/members/u1131830/" rel=nofollow>karetsos</A> <A "
В настоящее время я использую это:
Regex pattern = new Regex ( "<A\\s+href=\"([^\"]*)\">([^\\x00]*?)\\s+id=thread_title_(\\S+)</A>" ); MatchCollection matches = pattern.Matches ( doc.ToString ( ) ); foreach ( Match match in matches ) { int id = Convert.ToInt32 ( match.Groups [ 1 ].Value ); string name = match.Groups [ 3 ].Value; string link = match.Groups [ 2 ].Value; ... }
Но это ничего не соответствует.
Все, что я пытаюсь извлечь, это:
ID: 942321, 512147.
942321
512147
Имена: "Visible Thread Name", "Cool Thread"
"Visible Thread Name"
"Cool Thread"
Ссылки: "http://url.com/forum/f80/new-topic-name-942321", "http://url.com/forum/f80/cool-topic-name-512147"
"http://url.com/forum/f80/new-topic-name-942321"
"http://url.com/forum/f80/cool-topic-name-512147"
Есть идеи как это исправить?
Список найденных проблем:
По умолчанию регулярные выражения чувствительны к регистру (a! = A).Одним из возможных решений является передача RegexOptions.IgnoreCase в качестве второго параметра вашему конструктору Regex.
id=thread... вы, похоже, пропускаете открытие " после id
id=thread...
"
id
После сопоставления идентификатора вы внезапно останавливаетесь ... разве вы не хотите сопоставить имя и в третьей группе?Я предполагаю, что ваше регулярное выражение должно заканчиваться так:
id=\"thread_title_([0-9]+)\">([^<]+)</a>
О, и не закрывайте тег a после href, потому что thread_title_id все еще находится внутри тега:
a
href=\"([^\"]*)\">: удалить > в конце
href=\"([^\"]*)\">
>
Кроме того, удалить странную группу [^\\x00]*?.Чем это все равно хорошо?
[^\\x00]*?
После захвата thread_title_id вам нужно игнорировать вещи до закрытия >, чтобы игнорировать атрибут style=....
style=...
Полное решение (предупреждение, спойлер впереди).Синтаксис @"..." гарантирует, что вам не нужно избегать обратной косой черты (но вы должны избегать кавычек двойными кавычками).
@"..."
Regex pattern = new Regex (@"<a\s+href=""([^""]*)""\s+id=""thread_title_([0-9]+)""[^>]*>([^<]+)</a>");
Кстати, для отладки я использовал следующий инструмент:который я могу порекомендовать и который автоматически предоставляет экранированную версию:
Это возвращает то, что вам нужно.Не нужно быть слишком строгим здесь:
<a.+href=".*topic\-name\-(\S+)\/.+thread_title_(\S+)"