powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсинг подстроки из строки
12 сообщений из 12, страница 1 из 1
Парсинг подстроки из строки
    #39446334
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Надо пропарсить подстроку из строки по такому принципу: на вход подаётся строка, начало подстроки, конец подстроки.

Написал такую функцию:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 public static string ParseObjectFromString(string data, string start_pattern, string finish_pattern)
        {
            string result = "";
            try
            {
                if (data == "")
                    return null;

                int index_start = data.IndexOf(start_pattern);
                int index_finish = data.IndexOf(finish_pattern);

                int start_pattern_length = start_pattern.Length;
                int finish_pattern_length = finish_pattern.Length;

                result = data.Substring((index_start + start_pattern_length), (index_finish - index_start - finish_pattern_length + 1));
                // string result - приписано -1
            }
            catch(Exception e)
            {
                result = "NULLLLLL";
            }

                if (result != "")
                    return result;
                else
                    return null;
            
        }



Однако, она работает с ошибками: иногда позиция конца подстроки меньше позиции начала подстроки, тогда обрабатывается исключение.
А бывает, что захватывает лишние куски, не относящиеся к строке.

На простых строках работает нормально, ошибки происходят, когда в качестве строки подаётся код сайта(скачивается с помощью WebClient) и надо пропарсить, допустим, description.

К примеру, сайт

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
string wcode = "";
                    string desc = "";
                    wcode = wc2.DownloadString("http://dandyland.ru/shop/product/GTA-iV-Grand-Theft-Auto-GTA-4-Xbox-360.html");
                    if (wcode.IndexOf("<meta name=\"description\" content=") != -1)
                    {
                        desc = WebW.ParseObjectFromString(wcode, "<meta name=\"description\" content=\"", "\">");
                        if (desc == "NULLLLLL")
                        {
                            desc = WebW.ParseObjectFromString(wcode, "<meta name=\"description\" content=\"", "/>");
                            if (desc == "NULLLLLL")
                            {
                                desc = WebW.ParseObjectFromString(wcode, "<meta name=\"description\" content=\"", "//>");
                                if (desc == "NULLLLLL")
                                {
                                    desc = WebW.ParseObjectFromString(wcode, "<meta name=\"description\" content=\"", "\" >");
                                }
                            }
                        }
                    }
                    else if (wcode.IndexOf("<meta name=\"Description\" content=") != -1)
                    {
                        desc = WebW.ParseObjectFromString(wcode, "<meta name=\"Description\" content=\"", "\">");
                        if (desc == "NULLLLLL")
                        {
                            desc = WebW.ParseObjectFromString(wcode, "<meta name=\"Description\" content=\"", "/>");
                            if (desc == "NULLLLLL")
                            {
                                desc = WebW.ParseObjectFromString(wcode, "<meta name=\"Description\" content=\"", "//>");
                                if (desc == "NULLLLLL")
                                {
                                    desc = WebW.ParseObjectFromString(wcode, "<meta name=\"Description\" content=\"", "\" >");
                                }
                            }
                        }
                    }
                    else
                        desc = "NULLLLL";



На сайтах бывает написано и Description, и description, и закрывающий тег или ">, или " > , поэтому необходимы эти if-ы

Результат:

PS4, PS3, Xbox 360, Xbox One, vita Если вы желаете приобрести
GTA: Grand Theft Auto IV (4) (Xbox 360) БУ
позвоните по
телефону +7 (925) 225-66-05 или оформите заказ в интернет магазине" >
<meta http-equiv="Content-Ty

Для сайта


результат: NULLLLLL


Знаю, что можно парсить выражения с помощью регулярок.
Однако хотелось бы довести до ума эту функцию.
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446390
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем еще раз писать функцию, которая уже написана?

Кроме того, гуры рекомендуют для парсинга html-страниц использовать HtmlAgilityPack, а не регулярки.
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446504
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Код: c#
1.
Regex regx = new Regex( string.Format(@"${0}(\.*){1}^", start_pattern, finish_pattern);


Примерно так для одной строки. Не проврял
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446505
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Shocker.ProЗачем еще раз писать функцию, которая уже написана?

Кроме того, гуры рекомендуют для парсинга html-страниц использовать HtmlAgilityPack, а не регулярки.
Лишние телодвижения, если надо украсть одлну строку с другого сайта
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446515
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Примерно так для одной строки. Не проврял
1) надо отэскейпить паттерны
2) надо использовать ленивый квантификатор
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446517
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того, он же в html ищет, так что использовать $^ наверное нелогично, надо в multiline искать...
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446575
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сторонние библиотеки использовать не хочется, т.к. спарсить надо буквально пару строк.

Написал с помощью Regex:
Код: c#
1.
Console.WriteLine(Regex.Match(wcode, @"(<meta name=""description"" content="").*?("" >)", RegexOptions.Singleline));



В строке wcode - код веб-страницы сайта.
Всё нормально ищется, но хочу сделать так, чтобы можно было с помощью .Groups[2] вытащить само содержимое строки без тегов.
Однако 2-ую группу не получается оформить:
Код: c#
1.
Console.WriteLine(Regex.Match(wcode, @"(<meta name=""description"" content="")(.*)?("" >)", RegexOptions.Singleline));



Сбиваются настройки ленивого квантификатора.

P.S. В интернете не нашёл информации, как сделать ленивый метод поиска для группы в скобках.
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446596
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Shocker.ProCat2Примерно так для одной строки. Не проврял
1) надо отэскейпить паттерны
2) надо использовать ленивый квантификатор
Shocker.ProКроме того, он же в html ищет, так что использовать $^ наверное нелогично, надо в multiline искать...
Так я и не проверял. Направление дал, нормальному программисту этого достаточно
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446627
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mraklbrwкак сделать ленивый метод поиска для группы в скобках.знак лени добавляется к квантификатору, а не к группе, то есть так:
Код: c#
1.
(.*?)
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39446713
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Благодарю вас, разобрался.
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39447106
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А под C# разве нет DOM-а, как JavaScript?
...
Рейтинг: 0 / 0
Парсинг подстроки из строки
    #39447214
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thА под C# разве нет DOM-а, как JavaScript? 20445879
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсинг подстроки из строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]