Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярное выражение, помогите составить 
V
    Опции темы
uwannadie
  Дата 20.5.2013, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



возникла проблемка при разборе регулярки - то, что работает на сайте - не работает в программе =(
есть JSON: http://pastebin.com/WhfV2Htt
в нем значение параметра details надо вытащить и обработать одной из функций.
для вышеописанного процесса попытался на одном сайте протестить регулярку - там все работало замечательно.
но, увы, в шарпе оказалось не все так гладко - прога парсила либо 1 экземпляр данных либо вообще ничего, плюс не переваривает пробелы внутри строки (если воткнуть [\s], то парсит полтекста одним куском).

за саму регулярку просьба не пинать - пользую 2й раз в жизни  smile 
Код

private static string ReplaceDetailsInfo(string json)
{
    Regex regex = new Regex(@"'details': [a-zA-Z0-9!$%^&*()_+|~\-={}\[\]:"";'<>?,.\/\+\\#]+");
    Match match = regex.Match(json);
    for (int i = 0; match.Groups[i].Value != ""; i++)
    {
        string data = match.Groups[i].Value;              
        string tmp = data.Substring(10, data.Length - 11);
        if (tmp != "")
        {
            tmp = tmp.Remove(0, tmp.IndexOf("'"));
            tmp = ProcessDetails(tmp); // обработка блока вытащенных данных
        }
                else
                {
                       tmp = "''";
                }
        json.Replace(data, "'details': " + tmp);

    }
    return json;
}

по факту мне надо просто вытащить данные между 'details' и 'lifeTime' внутри текста
--------------------
PM MAIL   Вверх
Arantir
Дата 20.5.2013, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Цитата(uwannadie @  20.5.2013,  17:25 Найти цитируемый пост)
по факту мне надо просто вытащить данные между 'details' и 'lifeTime' внутри текста 
Код

new Regex(@"'details': (.*?), 'lifeTime'");
?

Это сообщение отредактировал(а) Arantir - 20.5.2013, 19:21


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
uwannadie
Дата 20.5.2013, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(Arantir @ 20.5.2013,  19:21)
Цитата(uwannadie @  20.5.2013,  17:25 Найти цитируемый пост)
по факту мне надо просто вытащить данные между 'details' и 'lifeTime' внутри текста 
Код

new Regex(@"'details': (.*?), 'lifeTime'");

почти идеально: не пережевывает симол "^" почему-то

Это сообщение отредактировал(а) uwannadie - 20.5.2013, 20:27
--------------------
PM MAIL   Вверх
uwannadie
Дата 20.5.2013, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



а еще странно то, что грабит только последнее вхождение по маске регулярки в строке.
но видимо это уже мой косяк в коде, буду разбираться

Добавлено через 11 минут и 48 секунд
Код

json = json.Replace(data, "'details': " + tmp); //ЛОХ ЭТО СУДЬБА ;)

--------------------
PM MAIL   Вверх
uwannadie
Дата 20.5.2013, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Arantir, большое спасибо. Все завелось.
Код

private static string ReplaceDetailsInfo(string json)
{            
    Regex regex = new Regex("'details': (.*?), 'lifeTime'", RegexOptions.Singleline|RegexOptions.CultureInvariant);            
    MatchCollection matches = regex.Matches(json);
    foreach (Match item in matches)
    {
        string data = item.Value;
        string tmp = data.Replace("'details': ", "");
        tmp = tmp.Replace(", 'lifeTime'", "");
        string quote = tmp[tmp.Length - 1].ToString();
        tmp = tmp.Substring(tmp.IndexOf(quote) + 1, tmp.Length - (tmp.IndexOf(quote) + 2));
        tmp = tmp.Substring(0, tmp.Length);
        if (tmp != "")
        {
            tmp = ProcessDetails(tmp);
            json = json.Replace(data, "'details': " + tmp + ", 'lifeTime'");
        }
        else
        {
            json = json.Replace(data, "'details': {}, 'lifeTime'");
        }
    }            
    return json;
}


Это сообщение отредактировал(а) uwannadie - 20.5.2013, 21:29
--------------------
PM MAIL   Вверх
Arantir
Дата 20.5.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Код

        string data = item.Value;
        string tmp = data.Replace("'details': ", "");
        tmp = tmp.Replace(", 'lifeTime'", "");
        string quote = tmp[tmp.Length - 1].ToString();
        tmp = tmp.Substring(tmp.IndexOf(quote) + 1, tmp.Length - (tmp.IndexOf(quote) + 2));
        tmp = tmp.Substring(0, tmp.Length);

Вообще-то, item.Groups содержит группы из регулярки. Первая группа — вся подстрока, а вот в  item.Groups[1] содержится как раз то, что между круглыми скобочками.
Если вам нужно выбирать сразу строку между кавычками, то:
Код

'details': u?['\"](.*?)['\"], 'lifeTime'

и будет достаточно
Код

        string tmp =  item.Groups[1];


Это сообщение отредактировал(а) Arantir - 20.5.2013, 21:37


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
uwannadie
Дата 20.5.2013, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(Arantir @ 20.5.2013,  21:25)
Код

        string data = item.Value;
        string tmp = data.Replace("'details': ", "");
        tmp = tmp.Replace(", 'lifeTime'", "");
        string quote = tmp[tmp.Length - 1].ToString();
        tmp = tmp.Substring(tmp.IndexOf(quote) + 1, tmp.Length - (tmp.IndexOf(quote) + 2));
        tmp = tmp.Substring(0, tmp.Length);

Вообще-то, item.Groups содержит группы из регулярки. Первая группа — вся подстрока, а вот в  item.Groups[1] содержится как раз то, что между круглыми скобочками.
Если вам нужно выбирать сразу строку между скобками, то:
Код

'details': u?['\"](.*?)['\"], 'lifeTime'

и будет достаточно
Код

        string tmp =  item.Groups[1];


спасибо, попробую smile
--------------------
PM MAIL   Вверх
diadiavova
Дата 21.5.2013, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



uwannadie, я правильно понял вопрос: ты регуляркой json парсишь? Не проще ли воспользоваться стандартными средствами?
http://msdn.microsoft.com/ru-ru/library/bb412187.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.