Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/113: Рейтинг темы: голосов - 113, средняя оценка - 4.81
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

RegExp - найти ошибку в коде

28.07.2013, 21:19. Показов 22485. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button7Click(TObject *Sender)
{
TStringList* List=new TStringList;  TRegExpr* RegExp=new TRegExpr;
List->Text=Memo1->Lines->Text;
for(int i=0; i<List->Count;i++)
{
 RegExp->InputString=List->Strings[i];
 RegExp->Expression="(<a href=\"|<sup id=\")(.*?)(\">)";
 if(RegExp->Exec(RegExp->InputString))
  {
   List->Strings[i]=RegExp->Replace(RegExp->Expression,"");
  }
}
Memo1->Lines->Text=List->Text;
}
HTML5
1
<p><a href="/wiki/15_%D0%BC%D0%B0%D1%8F" title="15 мая">15 мая</a> <a href="/wiki/2009_%D0%B3%D0%BE%D0%B4" title="2009 год">2009 года</a> открылся официальный сайт игры.<sup id="cite_ref-15" class="reference"><a href="#cite_note-15">[15]</a></sup> На нём сразу же появились системные требования игры.<sup id="cite_ref-16" class="reference"><a href="#cite_note-16">[16]</a></sup><sup id="cite_ref-17" class="reference"><a href="#cite_note-17">[17]</a></sup><sup id="cite_ref-18" class="reference"><a href="#cite_note-18">[18]</a></sup></p>
Программа выдает
HTML5
1
()
А должна выдавать
HTML5
1
<p>15 мая</a> 2009 года</a> открылся официальный сайт игры.[15]</a></sup> На нём сразу же появились системные требования игры.[16]</a></sup>[17]</a></sup>[18]</a></sup></p>
Скажите,что не так в коде.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2013, 21:19
Ответы с готовыми решениями:

Двумерный массив. Поиск нулей.Не могу найти ошибку ошибку в коде
Вот,например массив 5 5 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 считываются два числа m и n и далее в выходной...

Найти сумму целых отрицательных чисел удовлетворяющих условию (найти и исправить ошибку в коде)
#include&lt;iostream&gt; #include&lt;math.h&gt; using namespace std; int main() { int y = 0; for(int i = -21; i &lt; -99; i+=3) ...

Помогите найти ошибку в коде. Найти сумму ряда
Добрый день, помогите найти ошибку. Задача: Найти сумму ряда, вычисление ввести до тех пор пока разница между двумя соседними членами...

78
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 18:50
Студворк — интернет-сервис помощи студентам
Значит что \1 должно совпадать с первым выражением т.е p|li

Т.е

Code
1
2
3
<p></p>
// или
<li></li>
Но не
Code
1
<p></li>
Гуглил,но не нашел значения.
Ищи книгу Ben Forta "Регулярные выражения (10 минут на урок)" pdf
2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33456 / 21556 / 8248
Регистрация: 22.10.2011
Сообщений: 37,009
Записей в блоге: 12
23.08.2013, 19:43
Цитата Сообщение от Avazart Посмотреть сообщение
Можно попробовать упросить
Попробовать можно, но это не одно и то же. В изначальном выражении текст внутри <li> не может начинаться с <a, и текст внутри <p> не начинается с тега <i>, да и цифры не присутствуют в <li>, и буквы разные... В общем, это совсем не идентичная замена в данном случае...

К тому же надо принимать во внимание, что функционал TRegExpr-а очень урезан по сравнению с теми же регулярками в JS, или в Перле. Скажем, (\s*\b[а-яА-Я]{4,}\b) мне тут не удалось заставить работать, хотя это вполне себе рабочая конструкция...
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
23.08.2013, 20:08  [ТС]
Avazart, да,Ваша регулярка работает
Только ее чуть-чуть нужно поправить(забыли продублировать слеш перед единицей):
C++
1
<(p|li)>([\\s0-9а-яА-Я]|<a |<b>|<i>|<b>)(.*?)</\\1>
Теперь уж точно заработает
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
23.08.2013, 23:34
Я, конечно, дико извиняюсь, но в факе http://www.regexpstudio.com/RU... p/FAQ.html черным по белому написано:
В.
Как анализировать HTML с помощью TRegExpr
О.
Мне очень часто задают этот вопрос! Должен вас огорчить, корректный ответ - "никак".
Конечно, вполне возможно (и очень удобно) использовать TRegExpr для извлечения каких-то специфичных фрагментов HTML, я сам часто этим пользуюсь, но если Вам нужен полноценный синтаксический разбор, то возьмите подходящий инструмент - синтаксический анализатор, а не регулярные выражения!
Мне не хочется занимать здесь место объяснениями почему это так - просто поверьте или почитайте например книжку Tom Christiansen и Nathan Torkington 'Perl Cookbook' (в русском переводе вышла в серии "Библиотека программиста" и называется просто "Perl"). Если в двух словах - мало того что отдельные случаи даже теоретически невозможно обработать с помощью регулярных выражений, так еще и не стоит забывать, что регулярные выражения это достаточно ресурсоемкий механизм выполняющий оптимизационный поиск, в то время как синтаксический анализ обычно линеен и работает гораздо быстрее. Используйте подходящие инструменты для каждого вида работ!
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:26
gunslier, Мм... вы лучше посоветовали бы что использовать в замен регексов...

Я к примеру упомянул ранее libxml2.

Добавлено через 5 минут
Так же можно писать свой велосипед заточеный под конкретную задачу, и он работать скорее всего будет даже быстрее.
2
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
24.08.2013, 00:54
Посоветовать пока вряд ли что смогу (к тому же ты сам указал альтернативу). Только недавно открыл для себя регэкспы (ранее использовал строковый/текстовый поиск через Pos и циклы), доволен сверх меры (более компактный код, хотя поначалу непривычно). Для моих задач ("выдрать" конкретную ссылку и т. п.) вполне достаточно, "извращенный" в хорошем смысле поиск пока мне ни к чему (серьезным анализом HTML-страниц не занимаюсь).
Если хорошо разбираться в RegExp, то можно и им обойтись. Но как было указано в цитате, "гвозди лучше забивать молотком, а не пассатижами".
0
24.08.2013, 00:57

Не по теме:

Ну а также был там упомянут Perl я так и не понял к чему ...

0
24.08.2013, 01:28

Не по теме:

Наверно потому, что

В качестве языка правил используется подмножество регулярных выражений Перла (Perl regular expressions, regexp).
http://regexpstudio.com/RU/TRe... About.html

0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.08.2013, 11:12  [ТС]
Avazart, я пошарил в инете,но не нашел никаких примеров использования libxml2 для парсинга HTML. Тут так же нет ничего
Зато нашел вот это,но это совсем другое
P.S. я так понял,что с помощью libxml2 можно анализировать html код на ошибки с возможностью дальйшего вырывания нужных частей из html кода?
Кликните здесь для просмотра всего текста
Так это мы что,зря с UI мучились(с основном он мучился:black_eye. с этим regexp
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33456 / 21556 / 8248
Регистрация: 22.10.2011
Сообщений: 37,009
Записей в блоге: 12
24.08.2013, 11:26
Gdasar, ты меньше на всяких теоретиков обращай внимания, будет лучше. Тот код, который у тебя сейчас есть, работает? Вот и прекрасно. Теоретически, знаешь ли, даже единицу нельзя разделить на 3 абсолютно равные части (любой математик-теоретик даст тебе руку на отсечение), однако любой, кто хоть раз в жизни разрезал круглый торт, знает, что это не так. Разделить окружность на 3 сектора по 120 градусов может любой ребенок. Прощай, рука математика... Не теоретиков надо слушать, тем более таких, которые
Цитата Сообщение от gunslier Посмотреть сообщение
Только недавно открыл для себя регэкспы (ранее использовал строковый/текстовый поиск через Pos и циклы)
, а практиков...

Есть еще одна идея, и мне кажется, она прекрасно сработает, но это уже не для теоретиков (они вообще могут от этого голову потерять), если интересно - в приват...
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 11:42
Тут так же нет ничего
Т.е. ?

Там есть пример замены, все остальное есть в документации которая указана по ссылке.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.08.2013, 11:48  [ТС]
HTML5
1
присоединяется скрипт «alert('Hello libXML!');»:
А где замена то?

Не по теме:

Цитата Сообщение от UI Посмотреть сообщение
Есть еще одна идея, и мне кажется, она прекрасно сработает, но это уже не для теоретиков (они вообще могут от этого голову потерять), если интересно - в приват...
Отписался в ЛС...

0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 12:00
C++
1
2
//  xmlSetProp создает либо меняет значение атрибута
        xmlSetProp(cur_node, (const xmlChar *)"onload", (const xmlChar*)"alert('Hello libXML!');");
Добавлено через 10 минут
Цитата Сообщение от UI Посмотреть сообщение
ты меньше на всяких теоретиков обращай внимания, будет лучше. Тот код, который у тебя сейчас есть, работает?
Да но может получится что, если важна скорость, то практика может вылиться в потраченные человеко-часы.
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
23.11.2013, 18:52  [ТС]
Добрый вчер
У меня опять возникла проблема с регэкспами.
Ну в общем имеется исходный текст:
HTML5
1
2
3
4
5
6
7
8
9
10
{/*Ться*/
играться
валяться
}
 
{
/*ть*/
играть
валять
}
И мне нужно поочереди спарсить содержимое вот этих 'тегов'
{
/*TEXT*/
TEXT1
}
то бишь TEXT и TEXT1

Пытаюсь так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{ 
TRegExpr *Reg = new TRegExpr;     TStringList *List = new TStringList;
TStringList *Listok = new TStringList;
Listok->Text=Memo1->Lines->Text;
//Reg->ModifierM = true;
Reg->InputString=Listok->Text;
Reg->Expression="({/\\*(.*?)\\*/(.*?)\\})";
Reg->Compile();
//for(int i=0;i<3;++i)
if(Reg->Exec(Reg->InputString))
    {
        do
        {
            List->Add(Reg->Match[3]);
        }
        while (Reg->ExecNext());
    }
 Memo3->Text=List->Text;
 delete Reg;
 delete List;
 delete Listok;
}
Но парсится только первые TEXT и TEXT1(ться и играться,валяться ) дальше никак
В данном случае достается только играться,валяться.
0
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 8
24.11.2013, 02:44
Если в Memo1 оставить только вторую часть выражения (с "ть"), то она парсится или нет? Если да, то либо разбивай на части стринглист и по одной парси, либо юзай ^ и $ для обработки начала и конца строки. Если нет, то копай в сторону правильности регулярки. ИМХО, в зависимости от значения модификатора возможно лучше юзать не (.*?), а "не звездочка слэш" и "не }"... )
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.11.2013, 18:43  [ТС]
podkashey, нет,не парсится. Скорее всего рег.выражение не верное(хотя оно и не должно спарсить часть выражения (с "ть"),так как рег.выражение задано для полного блока).
Так же поигрался с флагами: global,multiline,но бестолку...
HELP! Почему так получается,что парсится лишь текст из первого блака? Помогите незнайке...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33456 / 21556 / 8248
Регистрация: 22.10.2011
Сообщений: 37,009
Записей в блоге: 12
24.11.2013, 21:08
Gdasar, а давай я попробую:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Reg->ModifierM = true;
Reg->Expression = "((\\S)*?({(\\s*)/\\*(.*?)\\*/(.*?)\\}))";
Reg->Compile();
 
if(Reg->Exec(Reg->InputString))
{
    do
    {
        List->Add(Reg->Match[6]);
    }
    while (Reg->ExecNext());
}
Memo3->Text=List->Text;
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.11.2013, 21:21  [ТС]
UI, спасибо!
Всегда выручаете

Не по теме:

Пойду штудировать книгу по рег.выражениям...

0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
23.03.2014, 00:22  [ТС]
Доброго времени форумчане.
Возник один вопрос.
Есть код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
TRegExpr *Reg = new TRegExpr;
TStringList* Text=new TStringList;
TStringList* Tmp=new TStringList;
Text->LoadFromFile(ExtractFileDir(Application->ExeName)+"\\t.txt");
Reg->ModifierM = true;
Reg->InputString=Text->Text;
Reg->Expression = "(\\{T\\}(.*?)\\{/T\\})";
Reg->Compile();
if(Reg->Exec(Reg->InputString))
do
{
    Tmp->Text=Reg->Match[0];
    Text->Text=StringReplace(Text->Text, Reg->Match[1], Reg->Match[2], TReplaceFlags() << rfIgnoreCase << rfIgnoreCase); 
}
while(Reg->ExecNext());
 
Reg->Expression ="(\\{M\\}(.*?)\\{/M\\})|(\\{P\\}(.*?)\\{/P\\})";
Reg->Compile();
if(Reg->Exec(Reg->InputString))
{
    Text->Text = Reg->Replace(Reg->InputString,"", false);
}
Reg->Free();
Text->SaveToFile(ExtractFileDir(Application->ExeName)+"\\t_new.txt");
Text->Free();
Данный код выполняется частично , в данном случае выполнится только :
C++
1
2
3
4
5
6
7
if(Reg->Exec(Reg->InputString))
do
{
    Tmp->Text=Reg->Match[0];
    Text->Text=StringReplace(Text->Text, Reg->Match[1], Reg->Match[2], TReplaceFlags() << rfIgnoreCase << rfIgnoreCase); //заменяем макросы;
}
while(Reg->ExecNext());
но не выполнится это :
C++
1
2
3
4
5
6
Reg->Expression ="(\\{M\\}(.*?)\\{/M\\})|(\\{P\\}(.*?)\\{/P\\})";
Reg->Compile();
if(Reg->Exec(Reg->InputString))
{
    Text->Text = Reg->Replace(Reg->InputString,"", false);
}
По отдельности эти части работают великолепно.
Следовательно, вопрос :
с чем связанно такое поведение регэкспа? Из-за чего появляется данный артефакт?
0
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 8
23.03.2014, 01:29
Или на два независимых регэкспа разбей для каждой регулярки или условие while перенеси на пару строчек ниже. Смотря, что ты хочешь сделать в итоге.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2014, 01:29

Программа с RegExp выдает ошибку
Использую следующую схему в ms access: Dim re As New RegExp re.Pattern = &quot;(?&lt;=)({5})(?!)&quot; For Each m In re.Execute(&quot;101000,...

Найти ошибку в коде
Здравствуйте! В общем вот код: &lt;?php /* Принимаем данные из формы */ if(get_magic_quotes_gpc()==1) { ...

Найти ошибку в коде
пожалуйста найдите ошибку((( #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #define FALSE 0 ...

Найти ошибку в коде
procedure TForm1.Button1Click(Sender:TObject); var xn, xk, x, s, h, y, al, del, p, f: extended; n, i: integer; begin n...

Найти ошибку в коде
нужно найти все значения с по формуле ck=a(k)+x*s(k-1) c0=a0 с помощью рекурсии. У меня программа работает правильно(наверно) но как...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru