Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Регулярные выражения: подстрока с кавычками  (Прочитано 9282 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« : 27-04-2016 07:45 » 

Выдираю текстовые подстроки из с++ файлов по шаблону от _T("   до ")

Код: (C++)
wregex reg(LR"(_T\(".*?"\))");

Всё нормально, тк заканчивается на ")

Теперь надо выдирать по шаблону от L"  до ".

Например

Код: (C++)
L"Goodbye \"cruel\" world"

Есть в регулярных выражениях что-то типа маскирования для определённой последовательности символов, в данном случае для  \"?

Проще говоря, я хочу получить на выходе L"Goodbye \"cruel\" world", а не L"Goodbye \"
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 27-04-2016 09:17 » 

Какой поддерживаемый стандарт регулярных выражений? POSIX или PCRE?

Обои два должны поддерживать:
Код:
(_T\(".*?"\)|L".*?")

Подсчитывать количество кавычек в регулярке нереально, только постобработкой. Для PCRE можно сделать предусловие (?<!\\) перед второй кавычкой - "тут нет бекслеша", что не исключает ошибку типа "\\".

PS: сперва нарисовал с бекреференсами, да забыл, что нужны парные скобки.

Добавлено через 2 минуты и 54 секунды:
Для квотированной строки можно попробовать такое:
Код: (PCRE)
("(?:\\.|[^"\\])*")
На всяк напоминаю: для записи регулярки как С-строки нужно удвоить бекслеши до полной нечитаемости.
« Последнее редактирование: 27-04-2016 09:42 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 27-04-2016 10:04 » 

Хм... судя по всему POSIX. Я только недавно стал использовать регуляные выражения в С++, да вобще опыта с ними мало (в С# только и использовал).

Ром, оба варианта не надо. Будет работать в два прохода. Первый делает из _T(" -> L"
Второй уже будет выдирать L" ".

Просто сейчас в коде мешанина из _T(" и L", а тк к мультибайтной компиляции возврата нет и не будет, поэтому хочу перевести всё в L".

Я просто думал, что есть некое условие, которое позволит последовательность \" игнорировать в качестве замыкающих кавычек, типа: " не является искомой, если перед ней стоит \

Просто надо сделать "пабысраму" (никто не собирается платить за оптимизацию кода), а в теории навскидку ничего не нашёл.

Добавлено через 8 минут и 43 секунды:
На всяк напоминаю: для записи регулярки как С-строки нужно удвоить бекслеши до полной нечитаемости.

В последних версиях С++ придумана "таблетка" - скобки: R"( и )"
Аналогично додиезному @" ".

« Последнее редактирование: 27-04-2016 10:23 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Qulac
Постоялец

ru
Offline Offline

« Ответ #3 : 27-04-2016 10:40 » 

Джон, классы символов тут не могут помочь? У тебя перед завершающей кавычкой, может стоять любой символ кроме \. Это нужно описать в регексе.  Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 27-04-2016 10:45 » 

Нууу... Ром, дык! Работает!

Код: (C++)
wregex reg(LR"((L"(?:\\.|[^"\\])*"))"); // extract token within L" and "

Только вот тут заткнулась напрочь

Код: (C++)
#define RESET_TEMPL L"\x1b%%-12345X@PJL JOB NAME=\"%s\"\r\n\
@PJL SET DATE=\"%s\"\r\n\
@PJL SET TIME=\"%s\"\r\n\
@PJL MAINTENANCEINIT\r\n\
@PJL EOJ"

а вот из этого

Код: (C++)
        IEnumWbemClassObject* pEnumerator = NULL;
        hres = pSvc->ExecQuery(
                bstr_t("WQL"),
                //        bstr_t("SELECT * FROM Win32_OperatingSystem"),
                bstr_t("SELECT * FROM Win32_PnPSignedDriver"),
                WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
                NULL,
                &pEnumerator);

получилось

Код:
L"),
//        bstr_t("

Добавлено через 11 минут и 13 секунд:
Джон, классы символов тут не могут помочь?

"Вам-то хорошо" (с) Ага

На такие темы рассуждать.

Я тут можно сказать только недавно узнал, что С++ поддерживает регулярки. До этого весь мой опыт ограничивался выдиранием подстрок с очень простыми кавычками. И в этот раз можно было конечно сделать простой поиск с кучей условий, но раз С++ предлагает и можно сделать в пять строчек, то почему не воспользоваться.

Весь код

Код:
wstring data(stData);
wregex reg(LR"((L"(?:\\.|[^"\\])*"))"); // extract token within L" and "
wsregex_token_iterator pos(data.cbegin(), data.cend(), reg);
wsregex_token_iterator end;
for(; pos != end; ++pos)
{
auto st = CString(pos->str().c_str());
                        ...
}

зы Подсветку срр выключил, ибо LR"( не поддерживается.

У тебя перед завершающей кавычкой, может стоять любой символ кроме \. Это нужно описать в регексе.  Улыбаюсь

Обязательно буду разбираться, спасибо за такие подсказки. Код регулярки конечно хорошо, но мне лично это мало даёт. А учить матчасть в полном объёме сейчас чисто физически нет времени.
Тем более, если не знаешь, есть она (матчасть) ваще, или нет.
« Последнее редактирование: 27-04-2016 10:56 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 27-04-2016 11:41 » 

Только вот тут заткнулась напрочь

Нужно сказать движку регекспа, что у тебя многострочные строки (переводы строк - обычные символы).

а вот из этого

Значит нужно распасить все варианты строк и постобработкой пропустить ненужные.

Код: (PCRE)
(\w+)?("(?:\\.|[^"\\])*")
Первая группа будет префиксом, вторая - квотированной строкой.
« Последнее редактирование: 27-04-2016 11:47 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 27-04-2016 14:39 » new

Да эти примеры - скорее исключение.
Просто есть код, который записывает/читает данные из конфигурации. По ключам и значениям (типа реестра). Так все эти ключи и значения были жёстко загнаны в код. А мне из них надо сделать define типа

SaveValueToXMLConfig(REGKEY_PRINTERS, stPrinterName, stMatNo, L"THMCustomPrintMode", nMode);

#define REGVAL_THMCustomPrintMode L"THMCustomPrintMode"

SaveValueToXMLConfig(REGKEY_PRINTERS, stPrinterName, stMatNo, REGVAL_THMCustomPrintMode, nMode);

Меня в принципе интересовала возможность "маскирования" (как я это называю) в регулярках.
А с остальным разберусь понемногу.

Спасибо.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines