Что нового

Построчное удаление дубликатов фрагментов теста

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
Подскажите можно ли решить регулярными выражениями Построчное удаление дубликатов фрагментов теста.
Есть текст, в каждой строке которого нужно найти одинаковые куски (слова), оставить первоночальные и удалить последующие.

К примеру строка:
Код:
Штифт конический незакалённый, форма В, точёный, конусность 1:50; диаметр от 1 до 10, длина от 8 до 100 ГОСТ 3129-70, ISO 2339  ГОСТ 3129-70  ISO 2339

должно получится:
Код:
Штифт конический незакалённый, форма В, точёный, конусность 1:50; диаметр от 1 до 10, длина от 8 до 100 ГОСТ 3129-70, ISO 2339

или
Код:
Шайба плоская, с фаской, форма В; диаметр внутренний от 5.3 до 34 мм  DIN 125 В Шайба плоская с фаской, форма В, EN ISO 7090  ГОСТ 11371-78 ГОСТ 9649-78  ISO 7089 ISO 7090

должно получится:
Код:
Шайба плоская, с фаской, форма В; диаметр внутренний от 5.3 до 34 мм  , EN ISO 7090  ГОСТ 11371-78 ГОСТ 9649-78  ISO 7089

Заранее спасибо.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Andrey_A

А там все строки примерно такие?

Начать можно примерно с такого:
Код:
#include <Array.au3>

$sTring = 'Штифт конический незакалённый, форма В, точёный, конусность 1:50; диаметр от 1 до 10, длина от 8 до 100 ГОСТ 3129-70, ISO 2339  ГОСТ 3129-70  ISO 2339'

$aString = StringSplit($sTring, ' ;,')

_ArrayDelete($aString, 0)
$aString = _ArrayUnique($aString)
_ArrayDelete($aString, 0)
$sTring = _ArrayToString($aString, ' ')
ConsoleWrite($sTring & @CR)


Но нужно еще корректировать начальную строку, чтобы где надо не пропадали "ISO", "от", "до", "ГОСТ" и т.д., например, заменить пробелы после них на "_"
Если набор этих слов ограничен, то может получиться.
 
Автор
A

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
WSWR, спасибо за начало. Строки примерно одинаковые, Ваш код частично решает задачу, думал можно регулярку, но сам составить не смог. Посмотрю в сторону массивов, исходя Вашего примера. Спасибо.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Andrey_A
Для решения подобной задачи, нужно точно знать условия поиска кусков.
Например, куски заканчиваются знаком препинания или двойным пробелом.

[?]
Этот текст не соответствует задаче, тут на выходе удаляется не повторяющийся кусок.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
$sText='Штифт конический незакалённый, форма В, точёный, конусность 1:50; диаметр от 1 до 10, длина от 8 до 100 ГОСТ 3129-70, ISO 2339  ГОСТ 3129-70  ISO 2339'
$sText=StringRegExpReplace($sText, '( ГОСТ \d{4}-\d{2})(.*)\1', '\1\2')
MsgBox(0, 'Сообщение', $sText)
 
Автор
A

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
AZJIO, WSWR, спасибо!!! Текст оказался сложнее, чем я думал, но Ваши советы помогли. Дополнил сохранением ДО позиций запятых и кавычек, и возращением ПОСЛЕ. Всё получилось.
 
Верх