Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
1

Конвертация строки

03.09.2013, 13:25. Просмотров 1561. Ответов 17
Метки нет (Все метки)

Доброго дня, ребята подскажите имею строки вида
Код
#Постоянное значение:-1,(+99):Привет всем
http://адрес
Нужно преобразовать к виду -
Код
(+99):Привет всем,http://адрес
Я написал алгоритм с двух действий -
Получаю строку начинающуюся с http и получаю строку между http и 1, - но так долго идёт обработка , может есть другой более быстрый способ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2013, 13:25
Ответы с готовыми решениями:

Конвертация строки в число
Здравствуйте мне нужна ваша помощь чтобы исправить ошибку при компиляции (Смотрите вложения) Вот...

Конвертация строки 1361723049 в строку df324-rg901-jl437-lk103
Всем привет!:yes: Посоветуйте как можно осуществить следующее действие: как из цифр -...

Конвертация
Подскажите пожалуйста код как считать в бинарном виде файл и вывести его в виде 0 и 1 и...

Конвертация типов
Здравствуйте! Ребята помогите решить проблему вылетает ошибка вот здесь я выделил жирным void...

17
случайный прохожий
1491 / 972 / 372
Регистрация: 20.07.2013
Сообщений: 2,852
03.09.2013, 22:38 2
#include <StrUtils.hpp>
// . . .
AnsiString stroka = "<Трехглазый мальчик> - лучшая игра на Денди после <Боевых жаб>";
// AnsiReplaceStr - замена с учетом регистра символов, AnsiReplaceText - без учета
или использовать регулярные выражения
1
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
04.09.2013, 00:24  [ТС] 3
gunslier, Регуляркой не вышло у меня
Пока такое решение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    TStringList *List = new TStringList;
    List->Text=Memo1->Text;
    String Str;
    for(int i=0; i<List->Count; i++)   {
 
        if (List->Strings[i].Pos("-1"))
        {
            Str = List->Strings[i].SubString(List->Strings[i].Pos("-1")+3,1000);
            Memo2->Lines->Add(Str);
        }
        if (List->Strings[i].Pos("http"))
        {
            Str = List->Strings[i].SubString(List->Strings[i].Pos("http"),1000);
            Memo2->Lines->Add(Str);
        }
 
    }
    delete List;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
04.09.2013, 14:23 4
Ddv122, я правильно понимаю, что вот этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "RegExpr.hpp"
// ...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TRegExpr *re = new TRegExpr;
    re->InputString = Memo1->Lines->Text;
    re->ModifierM = true;
    re->Expression = "(^(#[^\\-]*)-1,)";
    if(re->Exec(re->InputString))
    {
        Memo2->Lines->Text = re->Replace(re->InputString, "", false);
    }
    delete re;
}
делает то же самое? К тому же он сохраняет те строки, которые не содержат "#Постоянное значение:-1", в первоначальном виде..
1
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
04.09.2013, 23:34  [ТС] 5
UI, спасибо - шикарно
Только вот появилась 2 проблема - как мне получить (+99):Привет всем это и это htp://адрес - отдельно

C++
1
2
3
4
5
6
7
8
9
if (List->Strings[i].Pos("-1"))
* * * * {
* * * * * * Str = List->Strings[i].SubString(List->Strings[i].Pos("-1")+3,1000);
* * * * * * Memo2->Lines->Add(Str);
* * * * }
* * * * if (List->Strings[i].Pos("http"))
* * * * {
* * * * * * Str = List->Strings[i].SubString(List->Strings[i].Pos("http"),1000);
* * * * * * Memo2->Lines->Add(Str2);
т.е что бы мог бы я сделать
C++
1
 Memo2->Lines->Add(Str + "12345689" + Str2 + Str);
но с вашим примером?
Уж простите на назойливость...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
05.09.2013, 00:04 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    TRegExpr *re = new TRegExpr;
    re->InputString = Memo1->Lines->Text;
    re->ModifierM = true;
    re->Expression = "(^(#[^\\-]*)-1,)(.*?)\\n(.*?)$";
    re->Compile();
    if(re->Exec(re->InputString))
    {
        do
        {
            // Match[0] = "#Постоянное значение:-1,(+99):Привет всем\r\nhttp://адрес"
            // Match[1] = "#Постоянное значение:-1,"
            // Match[2] = "#Постоянное значение:-1"
            // Match[3] = "(+99):Привет всем\r"
            // Match[4] = "http://адрес "
            Memo2->Lines->Add(re->Match[3] + re->Match[4]); // Можно убрать из Match[3] \r
        }
        while (re->ExecNext());
    }
    delete re;
Дальше разберешься?
2
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
05.09.2013, 00:17  [ТС] 7
UI, Спасибо огромное , разберусь конечно
0
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
15.12.2014, 01:25  [ТС] 8
Цитата Сообщение от volvo Посмотреть сообщение
(^(#[^\\-]*)-1,)(.*?)\\n(.*?)$
Ребята прошу помощи
C++
1
(^(#[^\\-]*)-1,)(.*?)\\n    //идеально
не много изменилось ситуация (исключение появилось) и ссылка :// может быть и не наследующей строчке а через строку
т.е
Код
#Постоянное значение:-1,(+99):Привет всем
Доброй ночи
://адрес
как поправить регулярку что бы она искала если не найдена на следующей строке искать на другой ?
т.е типа
C++
1
(^(#[^\\-]*)-1,)(.*?)\\n(.*?)\\n(.*?)$
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
15.12.2014, 21:35 9
Ddv122, и что в результате обрабтки
Код
#Постоянное значение:-1,(+99):Привет всем
Доброй ночи
http://адрес
надо получить?
1
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
15.12.2014, 23:51  [ТС] 10
Грубо говоря есть список

Код
#Постоянное значение:-1,Привет всем 1
адрес 1 //не  обязательно http 
#Постоянное значение:0,Привет всем 2
адрес 2  //не  обязательно http 
#Постоянное значение:2,Привет всем 3
Доброй ночи  лишняя строка (может быть, а но может и не быть ) 
адрес 3 //не  обязательно http
нужно получить 2 колонки

1
Код
Привет всем 1
Привет всем 2
Привет всем 3
C++
1
(^(#[^\\-]*)-1,)(.*?)
- обрабатывает идеально 1 колонку, со всеми нюансами и тд (Match[3] )
2
Код
адрес 1 
адрес 2
адрес 3
По моему познанию нужно использовать модификатор X (для URL парсинга) - но тогда не работает 1 часть регулярного выражения

При такой регулярке
C++
1
re->Expression = "(^(#[^\\-]*)-1,)(.*?)\\n(.*?)$";
попадается место последней ссылки - строка
Доброй ночи лишняя строка (может быть, а но может и не быть )
а нужна сcылка
те парсим слово после запятой (1 или 2) и на следующей (или через строку) ссылку ( но не обязательно Http ) ... но думаю подойдет (://)
Извиняюсь за надоедливость
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
16.12.2014, 00:13 11
C++
1
re->Expression = "(^(#[^,]*),)(.*?)\\n((://.*?)|(.*?))\\n$";
, в Match[3] будет содержимое первой колонки, в Match[4] (начиная с символов :// и дальше - содержимое второй колонки)
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
16.12.2014, 13:49 12
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

А вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    TRegExpr *re = new TRegExpr;
    re->InputString = Memo1->Lines->Text;
    re->ModifierM = true;
    re->Expression = "#([^,]*),([^\\n]*)\\n(([^#h]*\\n)?((http://(.*?))\\n))";
 
    re->Compile();
    if(re->Exec(re->InputString))
    {
        do
        {
            Memo2->Lines->Add(re->Match[2] + "\n" + re->Match[6]); // Можно убрать из Match[3] \r
        }
        while (re->ExecNext());
    }
    delete re;
из содержимого
Код
https://www.cyberforum.ru/cpp-builder/1
https://www.cyberforum.ru/cpp-builder/2
#Постоянное значение:-1,Привет всем 0
#Постоянное значение:-1,Привет всем 1
https://www.cyberforum.ru/cpp-builder/3
https://www.cyberforum.ru/cpp-builder/4
#Постоянное значение:0,Привет всем 2
https://www.cyberforum.ru/cpp-builder/5
#Постоянное значение:2,Привет всем 3
Доброй ночи  лишняя строка (может быть, а но может и не быть ) 
https://www.cyberforum.ru/cpp-builder/6
#Постоянное значение:2,Привет всем 4
#Постоянное значение:2,Привет всем 5
https://www.cyberforum.ru/cpp-builder/7
https://www.cyberforum.ru/cpp-builder/8
получаем
Код
Привет всем 1
https://www.cyberforum.ru/cpp-builder/3
Привет всем 2
https://www.cyberforum.ru/cpp-builder/5
Привет всем 3
https://www.cyberforum.ru/cpp-builder/6
Привет всем 5
https://www.cyberforum.ru/cpp-builder/7
2
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
19.12.2014, 19:45  [ТС] 13
volvo, Спасибо огромное
Извиняюсь что подымаю тему, но не не могу
понять почему у меня не получается , к примеру вот список

Код
ftp://www.cyberforum.ru/cpp-builder/1
asder://www.cyberforum.ru/cpp-builder/2
#Постоянное значение:-1,Привет всем 0
#Постоянное значение:-1,Привет всем 1
rtmp://www.cyberforum.ru/cpp-builder/3
https://www.cyberforum.ru/cpp-builder/4
#Постоянное значение:0,Привет всем 2
https://www.cyberforum.ru/cpp-builder/5
#Постоянное значение:2,Привет всем 3
Доброй ночи *лишняя строка (может быть, а но может и не быть ) 
mmsh://www.cyberforum.ru/cpp-builder/6
#Постоянное значение:2,Привет всем 4
#Постоянное значение:2,Привет всем 5
rtmpe://www.cyberforum.ru/cpp-builder/7
rtmpe://www.cyberforum.ru/cpp-builder/8
пытаюсь отвязать регулярку от http - зная что ссылка на новой строке и присутствует ://
значит вместо
C++
1
#([^,]*),([^\\n]*)\\n(([^#h]*\\n)?(([url]http://(.*?))\\n[/url]))
будет
C++
1
#([^,]*),([^\n]*)\n(([^#^(.*?)://]*\n)?((^(.*?)://(.*?))\n))
Но всё рушится
Код
Привет всем 0
www.cyberforum.ru/cpp-builder/3
ну и пытался протокол соединить с ссылкой в конце - тоже результата нет...Ребят ткните носом пожалуйсто, чувствую что где то близко , но что то не так..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
19.12.2014, 20:11 14
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Ну смотри, вот такое выражение, скажем:
C++
1
re->Expression = "#([^,]*),([^\\n]*)\\n(([^#:/]*\\n)?((([a-z]*)://(.*?))\\n){1,1})";
на твоих данных вылавливает:
Привет всем 1
rtmp://www.cyberforum.ru/cpp-builder/3
Привет всем 2
https://www.cyberforum.ru/cpp-builder/5
Привет всем 3
mmsh://www.cyberforum.ru/cpp-builder/6
Привет всем 5
rtmpe://www.cyberforum.ru/cpp-builder/7
Это надо было?
1
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
19.12.2014, 20:30  [ТС] 15
volvo, Спасибо огромное !!!!!
Шикарно
Я кажись автор темы ,а функции лучшее сообщение нет почему то ....
и есть маленьких 2 нюанса ещё

Код
#Постоянное значение:2,Привет всем 3
Доброй ночи лишняя строка (может быть, а но может и не быть ): 
mmsh://www.cyberforum.ru/cpp-builder/6
#Постоянное значение:2,Привет всем 3
если во второй строке имеется символ в строке : или / ( вместе или по раздельности) - регулярка не работает и не важно в конце или середине символы ...
и если убрать полностью 4 строку - так же регулярка не работает ( видно ищет /n)
ну тут я уже сам разберусь с этими нюансами

Владимир, спасибо вы лучший
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30262 / 19770 / 7733
Регистрация: 22.10.2011
Сообщений: 34,496
Записей в блоге: 6
19.12.2014, 22:29 16
Цитата Сообщение от Ddv122 Посмотреть сообщение
и если убрать полностью 4 строку - так же регулярка не работает ( видно ищет /n)
Ну, это-то проще всего поправить, добавь в последнюю группу либо \n либо конец текста:
C++
1
re->Expression = "#([^,]*),([^\\n]*)\\n(([^#:/]*\\n)?((([a-z]*)://(.*?))(\\n|$)){1,1})";
, будет работать.

С остальным - чуть сложнее, будет время - посмотрю...
1
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
04.01.2015, 03:10  [ТС] 17
Доброго времени суток !)
С наступившем новым годом
Свою проблему решил так , случайно , но вроде работает
C++
1
re->Expression = "#([^,]*),([^\\n]*)\\n(([^\\d/]*\\n)?((([a-z]*)://(.*?))(\\n|$)){1,1})$";
volvo, спасибо огромное за помощь
0
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
03.06.2016, 20:41  [ТС] 18
volvo, давно хотел спросить
Можно ли сделать исключения в регулярках ?
Что бы пропускало строку если в ней есть к примеру слово ( тэг) div
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2016, 20:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Конвертация строк.
Существует задача преобразования текста, читаемого из файла в кодировке ANSI в кодировку ASCII,...

Конвертация word в pdf
Возник интересный вопрос. Можно ли написать программу для конвертации doc в word, самому?

Конвертация аудио форматов
Может быть, кто-нибудь с сим сталкивался? Буду очень благодарна!

Конвертация из AnsiString в WideChar
Есть ли возможность конвертировать из AnsiString в WideChar потому как в хелпе написано что, int...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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