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

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

Восстановить пароль Регистрация
 
krv
71 / 51 / 11
Регистрация: 10.07.2014
Сообщений: 328
07.08.2014, 17:36     Найти ошибку в регулярном выражении #1
Использую 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>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
07.08.2014, 17:54     Найти ошибку в регулярном выражении #2
Простите, а что вы имеет в виду под паттерном ".*?" ? Зачем знак вопроса?
krv
71 / 51 / 11
Регистрация: 10.07.2014
Сообщений: 328
07.08.2014, 17:57  [ТС]     Найти ошибку в регулярном выражении #3
паттерн .*? означает любой символ, количество вхождений от 0 и больше
паттерн .* означает любой символ, количество вхождений от 1 и больше
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
07.08.2014, 18:05     Найти ошибку в регулярном выражении #4
Цитата Сообщение от krv Посмотреть сообщение
паттерн .*? означает любой символ, количество вхождений от 0 и больше
паттерн .* означает любой символ, количество вхождений от 1 и больше
Кто вам такую глупость сказал?
krv
71 / 51 / 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
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
07.08.2014, 18:48     Найти ошибку в регулярном выражении #6
Цитата Сообщение от krv Посмотреть сообщение
Последний паттерн в выражении, если после него нет обрамляющего текста, должен быть жадным.
Можно и не жадный, но добавить после него знак конца строки $
Yandex
Объявления
07.08.2014, 18:48     Найти ошибку в регулярном выражении
Ответ Создать тему
Опции темы

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