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

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

28.07.2013, 21:19. Показов 22272. Ответов 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
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
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
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru