191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

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

28.07.2013, 21:19. Показов 22631. Ответов 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
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,038
Записей в блоге: 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,028
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,028
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
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,038
Записей в блоге: 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
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,038
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru