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

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

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

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

07.08.2014, 17:36. Просмотров 216. Ответов 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++
Цель: необходимо обнаруживать правильные относительные адреса в веб. Допустимый вид: file.php При этом могут быть разделены папки,...

Не учитывать перевод строки в регулярном выражении - C++
В PHP например есть модификатор &quot;s&quot; пример: &quot;$regex = &quot;/&lt;html&gt;.*&lt;/html&gt;/s&quot;; Если данный модификатор используется, метасимвол &quot;точка&quot;...

"Или" в регулярном выражении - C++
Пусть есть регулярное выражение вида &quot;expression1|expression2|expression3|expression4&quot; сравнивающее текст с четырьмя различными вариантами....

Исправить ошибку в выражении - C++
A=exp(-0.3*(i+j))*(j-5.3)*(j-0.7)*(j-6.5)*pow(i+j,2); где ошибка в строчке? выражение aij=e-0.3(i+j)(j-5.3)(j-0.7)(j-6.5)(i+j)2

Найти все варианты размещения знаков операций +,-,* на месте вопросов в выражении 1?2?3?4?5?6?7?8?9=100 - C++
Составить программу, которая бы нашла все варианты размещения знаков арифметических операций +,-,* на месте вопросительных знаков в...

Найти причины возникновения ошибки "Segmentation fault" в шаблонном лямбда-выражении (C++11) - C++
Добрый день. Есть такой код:template&lt;typename ChipSelect, typename T = uint8_t&gt; static T _readByte(uint8_t address) { ...

порядок в выражении - C++
a.x &lt; b.x || a.x == b.x &amp;&amp; a.y &lt; b.y как это понять: как (a.x &lt; b.x || a.x == b.x) &amp;&amp; a.y &lt; b.y или a.x &lt; b.x || (a.x == b.x &amp;&amp; a.y &lt;...

Найти ошибку - C++
Задание: написать прогу, где запрашивается рост в футах и дюймах и вес в фунтах. (Используй 3 переменные) Должен высчитываться индекс массы...

Найти ошибку - C++
#include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #pragma hdrstop class...

Найти ошибку - C++
Добрый вечер, видал на форуме дня 3-4 назад пост с этим кодом и дело в том что перевод слов делается только en-&gt;ru, а на оборот никак не...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
3085 / 1933 / 511
Регистрация: 13.02.2013
Сообщений: 6,440
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
3085 / 1933 / 511
Регистрация: 13.02.2013
Сообщений: 6,440
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
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
07.08.2014, 18:48     Найти ошибку в регулярном выражении #6
Цитата Сообщение от krv Посмотреть сообщение
Последний паттерн в выражении, если после него нет обрамляющего текста, должен быть жадным.
Можно и не жадный, но добавить после него знак конца строки $
Yandex
Объявления
07.08.2014, 18:48     Найти ошибку в регулярном выражении
Ответ Создать тему
Опции темы

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