PDA

Просмотр полной версии : [Помогите!] Можно ли через регулярки парсить данные последовательно?


iVs.Dark
13.08.2011, 17:38
Если да, то как?

выглядит вот так:
<a href="/123-name-name-...-name" class="*"><p>text</p></a>

регулярные выражение вот такое:
<a href="/([0-9]+)-(.*?)\"(.?*)>(.*?)</a>
а получить нужно 1 и 2 т.е. цифры и название; парсит только первое вхождение, а нужны все.

Все это дело в цикле, спарсил - записал в файл, и так пока он не закончится (т.е. не будет получено null)... а у меня парсит первое, записывает и уходит в бесконечный цикл :evil:

парсить нужно из сохраненной на диск html странички (а точнее просто txt файла с ее кодом); наверное можно просто обрезать начало строки по первое вхождение и дальше парсить? или обойтись функциями типа String, без регулярных...

если можно ответ с примером.

.AsTex.
13.08.2011, 20:44
Эмм, дайте угадаю,парсит последнее?
Примерно будет выглядеть так:
string regex = @"<a href=\"/([0-9]+)-(.*?)\"(.?*)>(.*?)</a>";
//тут все остальное,далее:

for( тут не помню(нету под рукой студии))
{
string link = myMatch.Groups[0].Value;//выведет ссылку
string xzche = myMatch.Groupsp[1].Value//выведет второе значение.


Могу ошибаться, тогда просто замените 0 на 1, а 1 на 2.
}

iVs.Dark
13.08.2011, 21:19
Эмм, дайте угадаю,парсит последнее?
Примерно будет выглядеть так:
string regex = @"<a href=\"/([0-9]+)-(.*?)\"(.?*)>(.*?)</a>";
//тут все остальное,далее:

for( тут не помню(нету под рукой студии))
{
string link = myMatch.Groups[0].Value;//выведет ссылку
string xzche = myMatch.Groupsp[1].Value//выведет второе значение.


Могу ошибаться, тогда просто замените 0 на 1, а 1 на 2.
}
спасибо, попробую. на msdn там было что-то подобное, тоже в цикле, только там индекс был i.

fesssi
13.08.2011, 21:39
Если да, то как?

выглядит вот так:
<a href="/123-name-name-...-name" class="*"><p>text</p></a>

регулярные выражение вот такое:
<a href="/([0-9]+)-(.*?)\"(.?*)>(.*?)</a>
а получить нужно 1 и 2 т.е. цифры и название; парсит только первое вхождение, а нужны все.


Да через Regex можно без проблем там просто Mach загоняет все с регулярки а потом иожно даже split по розделителю розобрать.
Попробуй так <a href="/123-name-name-...-name" class="*"><p>text</p></a>
<a href=\"/(.*?)\" class=\"*\"><p>text</p></a>
А потом по разделителю в массив и все. Если я правильно понял что тебя интересует только это: 123-name-name-...-name

iVs.Dark
13.08.2011, 22:14
Да через Regex можно без проблем там просто Mach загоняет все с регулярки а потом иожно даже split по розделителю розобрать.
Попробуй так <a href="/123-name-name-...-name" class="*"><p>text</p></a>
<a href=\"/(.*?)\" class=\"*\"><p>text</p></a>
А потом по разделителю в массив и все. Если я правильно понял что тебя интересует только это: 123-name-name-...-name

сначала попробую способ с циклом, а если не получится то этот с массивом. хотя лучше минимум лишних действий.

fesssi
13.08.2011, 23:02
сначала попробую способ с циклом, а если не получится то этот с массивом. хотя лучше минимум лишних действий.
Так ты же получаеш все равно массив значений там в Цикле ......for( тут не помню(нету под рукой студии))........
там посути тот же режекс)
так что это одно и тоже. мой просто проще.. как по мне вариант регулярна попроще ...

MCseller
14.08.2011, 01:04
Match a = Regex.Match(); // тут что парсим, регулярка[, настройки]

string i = a.Groups[0].Value; // если что-то спарсилось выводим всё с маской
string m = a.Groups[1].Value; // результат из первой группы (в твоем случае ([0-9]+))
и т.д., и т.п.

iVs.Dark
14.08.2011, 08:45
Сделал так:

page = System.IO.File.ReadAllText("1.html");
Regex myreg1 = new Regex("<a href="/([0-9]+)-(.*?)\"(.?*)>(.*?)</a>");
Match myreg2 = myreg1.Match(page);
id = myreg2.Groups[1].Value;
name = myreg2.Groups[2].Value;
int i = myreg2.Groups[4].Index;
page = page.Substring(i);

работает намного быстрее чем я ожидал, файл из 15000 строк меньше чем за минуту прогнало..

fesssi
14.08.2011, 17:52
Сделал так:

page = System.IO.File.ReadAllText("1.html");
Regex myreg1 = new Regex("<a href="/([0-9]+)-(.*?)\"(.?*)>(.*?)</a>");
Match myreg2 = myreg1.Match(page);
id = myreg2.Groups[1].Value;
name = myreg2.Groups[2].Value;
int i = myreg2.Groups[4].Index;
page = page.Substring(i);

работает намного быстрее чем я ожидал, файл из 15000 строк меньше чем за минуту прогнало..
Единственный минус не универсальность есть будет больше элементов.
Почитай Патерны программирования. Это дружеский совет как программисту... А так все норм УДАЧИ)