Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
krv
72 / 52 / 11
Регистрация: 10.07.2014
Сообщений: 328
#1

Найти ошибку в регулярном выражении - C++

07.08.2014, 17:36. Просмотров 207. Ответов 5
Метки нет (Все метки)

Использую RegExpr модуль от Андрея Сорокина.
Сделал небольшое изменение для удобства использования в билдере:
Pascal
1
2
3
const
//  EscChar = '\'; // 'Escape'-char ('\' in common r.e.) used for escaping metachars (\w, \d etc).
  EscChar = '/'; // 'Escape'-char ('\' in common r.e.) used for escaping metachars (\w, \d etc). //Изменил для Сбилдера
Есть выражение
C++
1
2
r->Expression ="<error (.*?)<//error>";
r2->Expression = "code='(/d+)' pos='(/d+)' row='(/d+)' col='(/d+)' len='(/d+)'>.*?<word>(.*?)<//word>(.*?)"
Есть исходный текст в переменной txt
XML
1
2
3
4
5
6
<SpellResult>
<error code='1' pos='12' row='0' col='12' len='4'>
<word>шосе</word>
<s>шоссе</s>
</error>
</SpellResult>
При вызове
C++
1
2
3
4
5
if r->Exec(txt) {
  if (r2->Exec(r->Match[1])) {
  ....
  }
}
r->Match[7] - пустой, хотя должен содержать <s>шоссе</s>
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2014, 17:36     Найти ошибку в регулярном выражении
Посмотрите здесь:

найти ошибку C++
C++ Массивы. Найти среднее арифметическое элементов массива, расположенных до максимального элемента (найти ошибку в задании)
C++ В строках матрицы с отрицательным элементом на главной диагонали найти наибольший из всех элементов (найти ошибку в коде)
Исправить ошибку в выражении C++
C++ Найти сумму первых n-четных натуральных чисел (найти ошибку)
C++ Найти все варианты размещения знаков операций +,-,* на месте вопросов в выражении 1?2?3?4?5?6?7?8?9=100
"Или" в регулярном выражении C++
C++ Помогите найти ошибку: По двум сторонам и углу найти все остальное
Не учитывать перевод строки в регулярном выражении C++
C++ Задача из Златопольского: "Найти числа с известным количеством делителей". Не могу найти ошибку
Получение подвыражений в регулярном выражении C++
Найти причины возникновения ошибки "Segmentation fault" в шаблонном лямбда-выражении (C++11) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
 Аватар для quwy
3078 / 1926 / 505
Регистрация: 13.02.2013
Сообщений: 6,414
07.08.2014, 17:54     Найти ошибку в регулярном выражении #2
Простите, а что вы имеет в виду под паттерном ".*?" ? Зачем знак вопроса?
krv
72 / 52 / 11
Регистрация: 10.07.2014
Сообщений: 328
07.08.2014, 17:57  [ТС]     Найти ошибку в регулярном выражении #3
паттерн .*? означает любой символ, количество вхождений от 0 и больше
паттерн .* означает любой символ, количество вхождений от 1 и больше
quwy
Native x86
 Аватар для quwy
3078 / 1926 / 505
Регистрация: 13.02.2013
Сообщений: 6,414
07.08.2014, 18:05     Найти ошибку в регулярном выражении #4
Цитата Сообщение от krv Посмотреть сообщение
паттерн .*? означает любой символ, количество вхождений от 0 и больше
паттерн .* означает любой символ, количество вхождений от 1 и больше
Кто вам такую глупость сказал?
krv
72 / 52 / 11
Регистрация: 10.07.2014
Сообщений: 328
07.08.2014, 18:15  [ТС]     Найти ошибку в регулярном выражении #5
Из хелпа к модулю.
"." совпадает с любым символом,
*? ноль или более раз ("не жадный"), то же что {0,}?
* ноль или более раз ("жадный"), то же что {0,}

Небольшое пояснение по поводу "жадности". "Жадные" варианты повторителей пытаются захватить как можно большую часть входного текста, в то время как "не жадные" - как можно меньшую
Добавлено через 5 минут
Да, действительно, вопрос решился
Последний паттерн в выражении, если после него нет обрамляющего текста, должен быть жадным.
то есть
C++
1
r2->Expression = "code='(/d+)' pos='(/d+)' row='(/d+)' col='(/d+)' len='(/d+)'>.*?<word>(.*?)<//word>(.*)"
Спасибо за то что указали куда обратить внимание
igorrr37
 Аватар для igorrr37
1600 / 1228 / 121
Регистрация: 21.12.2010
Сообщений: 1,875
Записей в блоге: 7
07.08.2014, 18:48     Найти ошибку в регулярном выражении #6
Цитата Сообщение от krv Посмотреть сообщение
Последний паттерн в выражении, если после него нет обрамляющего текста, должен быть жадным.
Можно и не жадный, но добавить после него знак конца строки $
Yandex
Объявления
07.08.2014, 18:48     Найти ошибку в регулярном выражении
Ответ Создать тему
Опции темы

Текущее время: 10:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru