Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Нежелательные переносы строк в результатах поиска RegExpr

23.02.2016, 08:12. Показов 1315. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята доброго дня. Проблема очень своеобразная.
Не когда не было проблем с регулярками, но тут столкнулся с не удачей -
в тексте по всей видимости есть ( не стандартное /r ( не видимое)) или что то в этом роде
как его обработать ?

Первые 4 строки - все хорошо , а последние - делит слово таб летки


Code
1
2
3
4
5
6
7
8
9
10
МА 8824373    27.03.2015  31.03.2015  Карбамазепин(о)        100 таб  27000   27000
МА 8826462    30.04.2015  20.05.2015  Тимолол      2 упак  46500   46500
МА 8831609    17.07.2015  28.07.2015  Глаумакс        1 упак  62900   62900
МА 8823872    05.03.2015  23.03.2015  Эуфеллин (о)       5 амп    12778   11500
МА 8826454    30.04.2015  20.05.2015  Карбамазепин        "100 таб
летки" 66500   66500
МА 8828174    01.06.2015  10.06.2015  Карбамазепин        "100 таб
летки" 97000   97000
МА 8835112    21.08.2015  10.09.2015  Карбамазепин        "100 таб
летки" 96000   96000
хоть этого переноса в блокноте и т.д не видно

Code
1
(МА|ВИ|АМ|МА-1|МА-2)\s((.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s{2,}(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+)

Прошу помощи
Миниатюры
Нежелательные переносы строк в результатах поиска RegExpr   Нежелательные переносы строк в результатах поиска RegExpr   Нежелательные переносы строк в результатах поиска RegExpr  

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2016, 08:12
Ответы с готовыми решениями:

Ссылки в результатах поиска
Здравствуйте! Написал поиск на свой сайт. Все работает, но в поисковой выдаче результаты поиска отображаются как обычный текст без ссылки...

Обозначения в результатах поиска
Подскажите пожалуйста, кто знает. В результатах поиска в Яндексе у некоторых позиций стоит дата, у некоторых только размер, а у меня ...

Сайт на 1 и на 3 месте в результатах поиска
Может я что-то пропустил? Давно так? http://yandex.ru/yandsearch?text=%D1%81%D0...0%B0&lr=213

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
23.02.2016, 10:44
Ты б лучше файл для тестов приложил. Как проверять-то? Если набрать вручную - то точно не будет никаких переносов, все заработает, а твоя проблема не решится.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.02.2016, 11:06  [ТС]
volvo,
В блокноте все в одну строку, а в каком либо AKELPAD - виден перенос .
уже пару раз сталкиваюсь с такими переносами - тут оно встречается в слове таблетка , еще видел такое же и в названиях медикаментов .
да и количество пробелов не фиксировано ....( по этому и использую \s+ ) в этом примере - фиксированное количество )
Code
1
МА 8826454    30.04.2015  20.05.2015  Карбамазепин        "100 таб
Миниатюры
Нежелательные переносы строк в результатах поиска RegExpr  
Вложения
Тип файла: txt file.txt (488 байт, 4 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
23.02.2016, 11:39
Как ты обрабатываешь этот файл? Грузишь целиком в строку и проходишь по ней регуляркой? Так вот сначала пройди, и замени отдельно стоящие LF-ы на пустую строку (попросту удали их)
C++
1
2
3
4
5
    String s = TFile::ReadAllText("D:\\test\\file.txt", TEncoding::GetEncoding(1251));
    std::auto_ptr<TRegExpr> re(new TRegExpr);
    re->Expression = "([^\\r])\\n";
    s = re->Replace(s, "$1", true);
    // дальше уже ищи своим регекспом в строке s то, что нужно
Добавлено через 1 минуту
А вообще, конечно, стоило бы разобраться, откуда этот LF появляется там, где его быть не должно.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.02.2016, 11:48  [ТС]
volvo, я думал так сделать - но документ с 100 000 строк - и более - боялся очень сильно понизить производительность по .

это криво авто составляемая таблица Excel - от туда такие траблы
Цитата Сообщение от volvo Посмотреть сообщение
Как ты обрабатываешь этот файл?
загрузку не делал - просто копипастом с Excel в Memo ( там много мусора а от туда паршу строки с названиями медикометов и 2 цены )
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
23.02.2016, 12:37
Лучший ответ Сообщение было отмечено Ddv122 как решение

Решение

Кстати, у тебя ж между токенами не пробелы там, а табы, это позволяет написать вот так:
Code
1
(МА|ВИ|АМ|МА-1|МА-2)\s((.*?)\t+(.*?)\t+(.*?)\t+(.*?)\t{2,}(.*?)\t+(.*?)\t+(.*?)\n)
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.02.2016, 13:58  [ТС]
volvo, Спасибо огромное . Всё работает...А может есть секрет как обработать вот такой вариант медикаментов? На данный момент - редактирую название медикамента в ручную
Или нужны правки самого Regexpr ? из-за кавычек я так понимаю сносит мозг
Вложения
Тип файла: txt prim2.txt (519 байт, 3 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
23.02.2016, 14:28
А что не так? Нормально они все парсятся:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    String s = TFile::ReadAllText("D:\\test\\prim2.txt", TEncoding::GetEncoding(1251));
    std::auto_ptr<TRegExpr> re(new TRegExpr);
    re->Expression = L"(МА|ВИ|АМ|МА-1|МА-2)\\s((.*?)\\t+(.*?)\\t+(.*?)\\t+(.*?)\\t{2,}(.*?)\\t+(.*?)\\t+(.*?)\n)";
 
    re->Compile();
    if(re->Exec(s))
    {
        do
        {
            Memo1->Lines->Add(
            String().sprintf(_T("(1:%s) (2:%s) (3:%s) (4:%s) (5:%s) (6:%s) (7:%s)"),
            re->Match[1], re->Match[3], re->Match[4], re->Match[5], re->Match[6], re->Match[7], re->Match[8]));
        }
        while(re->ExecNext());
    }
выдает в Memo:
Code
(1:МА) (2:8816930) (3:30.01.2015) (4:10.02.2015) (5:фарментин) (6:1 фл) (7:81000)
(1:МА) (2:8827996) (3:11.05.2015) (4:22.05.2015) (5:Фарментин БД 457) (6:1 упак) (7:83850)
(1:МА) (2:8816937) (3:18.02.2015) (4:23.02.2015) (5:П-АМ-3) (6:10 капс.) (7:14789000)
(1:МА) (2:8816949) (3:17.04.2015) (4:22.04.2015) (5:"Специализированный продукт детского диетического (лечебного) питания, 
сухая смесь ""П-АМ 3""") (6:10 упак) (7:17174000)
(1:МА) (2:8827995) (3:07.05.2015) (4:08.06.2015) (5:"Специализированный продукт детского диетического (лечебного) питания, 
сухая смесь ""П-АМ 3""") (6:3 упак) (7:4995900)
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.02.2016, 14:45  [ТС]
volvo, прошу прощения - мой косяк .
вся беда в том - как я понимаю что это загадочная LF ( перенос ) переходит и в результат S5

Цитата Сообщение от volvo Посмотреть сообщение
5:"Специализированный продукт детского диетического (лечебного) питания,
сухая смесь ""П-АМ 3""")
а я собираю в отдельный мемо все медикаменты - и от туда удаляю дубликаты ....Вот она и бьется

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   TStringList *list = new TStringList;
    list->Text = Memo4->Text;
    list->Duplicates=dupIgnore;
    list->Sorted=True;
    AnsiString del;
    for(int i = 0; i < list->Count; i++)
    {
        del = list->Strings[i];
        for(int y = 0; y < list->Count; y++)
        {
            if(list->Strings[y] == del)
            {
                list->Delete(y--);
            }
            Application->ProcessMessages();
        }
        list->Add(del);
    }
    Memo6->Clear();
    Memo6->Text = list->Text;
    delete list;
и в итоге с этого списка

Code
1
2
3
4
5
6
7
8
Метотрексат
Метотрексат
П-АМ-3
"Специализированный продукт детского диетического (лечебного) питания, 
сухая смесь ""П-АМ 3"""
"Специализированный продукт детского диетического (лечебного) питания, 
сухая смесь ""П-АМ 3"""
фарментин
получаю

Code
1
2
3
4
5
"Специализированный продукт детского диетического (лечебного) питания, 
Метотрексат
П-АМ-3
сухая смесь ""П-АМ 3"""
фарментин
Что и логично. Но тут разберусь
Спасибо огромное за помощь
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
02.03.2016, 10:42  [ТС]
volvo, прошу прощения - ещё один вопросик .
а как можно обработать исключительную ситуацию?
к примеру когда нет цены
C++
1
re->Expression = "(МА|ВИ|АМ|МА-1|МА-2)\\s((.*?)\\t+(.*?)\\t+(.*?)\\t+(.*?)\\t{2,}(.*?)\\t+(.*?)\\t+(.*?)\n)";
в итоге хочу когда нет цены проставить 0 0
Может у вас будет какая идея ?
Вложения
Тип файла: txt file.txt (407 байт, 2 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
02.03.2016, 12:21
Лучший ответ Сообщение было отмечено Ddv122 как решение

Решение

Ddv122, отключи жадность и проверяй Match на IsEmpty:
C++
1
2
3
4
5
6
7
8
    String s = TFile::ReadAllText("D:\\test\\file.txt", TEncoding::GetEncoding(1251));
    std::auto_ptr<TRegExpr> re(new TRegExpr);
    re->Expression = L"(МА|ВИ|АМ|МА-1|МА-2)\\s((.*?)\\t+(.*?)\\t+(.*?)\\t+(.*?)\\t{2,}(.*?)\\t+(.*?)\\t+(.*?)\n)";
    re->ModifierG = false;
// ...
            Memo1->Lines->Add(
            String().sprintf(_T("(1:%s) (2:%s) (3:%s) (4:%s) (5:%s) (6:%s) (7:%s)"),
            re->Match[1], re->Match[3], re->Match[4], re->Match[5], re->Match[6], re->Match[7], (re->Match[8].IsEmpty() ? WideString("0") : re->Match[8])));
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
02.03.2016, 14:40  [ТС]
volvo,
Цитата Сообщение от volvo Посмотреть сообщение
отключи жадность
Спасибо очень интересно - не знал об этом.
Но теперь при отключенной жадности не дружит с двойными табами (медикомент и дата сливается) , можно в ручную указать t{2,} но тогда не дружит с одиночными - и универсальность регулярного выражения теряется

Может вы сможете предложить решение . Моих навыков к сожалению не хватает
Миниатюры
Нежелательные переносы строк в результатах поиска RegExpr  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
02.03.2016, 15:34
Ddv122, Откуда у тебя этот файл? Голову надо было оторвать за то, как получаются данные, которые тебе приходится использовать. Тебе на каждый чих придется переписывать регулярки, кто его знает, что они еще там выкинут, в файле в этом?

Вот так попробуй:
C++
1
2
    re->Expression = L"(МА|ВИ|АМ|МА-1|МА-2)\\s((.*?)\\t+(.*?)\\t+(.*?)\\t+(.*?)\\t{2,}(.*?)\\t{1,2}(.*?)\\t+(.*?)\\n)";
    // re->ModifierG = false;
, причин не работать не вижу. Пока, на этих исходных данных
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2016, 15:34
Помогаю со студенческими работами здесь

Цены на товары в результатах поиска
Собственно новость. Отличное решение.

lofiversion форума в результатах поиска
Есть один форумок старенький на ipb, на котором имеется некоторый траф, им давно не занимаюсь, но вот заглянул и обнаружил что в...

Пункты меню в результатах поиска
Даж не знал как назвать тему Заранее извиняюсь, если это известная штука. По некоторым запросам гугл выдает у 1ого места пункты меню. ...

Несколько ссылок в результатах поиска
Искал в этой ветке, так и не нашёл. Решил спросить создав тему. Если такова была - сильно не ругайте. Стал недавно замечать у...

Дополнительные ссылки, в результатах поиска
Привет. Иногда у сайтов, бывают какие то дополнительные ссылки, в резутатах поисковика. Пример, изображение снизу. Как обычно делают такие...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru