Что нового

[Данные, строки] Преобразование строки в нужный вид

invisible

Новичок
Сообщения
5
Репутация
0
имеются строки следующего вида:
КРС К58\7 7 (44,256) 8-6(Isam1) 5/48 (AnnxA)
или
КРС АТС-10 8*9 (9,) 5-6(Isam1) 7/9 (AnnxA)
после копирования одной из строк в буфер запускается скрипт, который должен привести строку к следующему виду и записи в $A[0] для последующего использования
КРСК58\77(Isam1)
или
КРСАТС-10(Isam1)
строки разнятся, может быть как Isam1 так и Isam2 и.т.д. значения цифр тоже меняются.

вот небольшой кусочек кода
Код:
$A = ClipConv()
$A = StringRegExp(StringStripWS(ClipConv(), 8), "(?s)(.+).*\D(\d+)/(\d+).*", 1)
IniWrite($IniFile, "", "", $A[0])
InputBox("", "", $A[0])


вот этим кусочком
Код:
.*\D(\d+)/(\d+).*
я получаю номера портов и плат КРС АТС-10 8*9 (9,) 5-6(Isam1) 7/9 (AnnxA)
они соответсвенно пишутся в $A[1] и $A[2]
 

CreatoR

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

invisible

Новичок
Сообщения
5
Репутация
0
т.е. если я правильно понимаю для каждого типа строки мне придется написать свое условие?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В принципе вот так можно, но это при условии что после первой искомой строки может встречаться либо число со знаком умножения (*), либо открывающая скобка:

Код:
$sVar = 'КРС К58\7 7  (44,256) 8-6(Isam1) 5/48 (AnnxA)'
;$sVar = ' КРС АТС-10 8*9  (9,) 5-6(Isam1) 7/9 (AnnxA)'

$sVar = StringStripWS($sVar, 8)

$sRet = StringRegExpReplace($sVar, '^(.*?)(?:\d\*|\().*?(\(\w+\)).*$', '\1\2')
ConsoleWrite($sRet & @LF)



Добавлено:
Сообщение автоматически объединено:

invisible [?]
для каждого типа строки мне придется написать свое условие?
Ну если так то отпадает необходимость в регулярных выражениях :smile:

Я про то, что нужно точно определиться с условием, и если строка значительно меняется, и это изменение нельзя уловить Pattern'ом (шаблоном), то задача усложняется для RegExp.
 
Автор
I

invisible

Новичок
Сообщения
5
Репутация
0
строка меняется не значительно.. в меняться будут только цифры!
 

CreatoR

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

В примере в первом сообщении указаны две строки, и два ожидаемых результата - первый учитывает всё содержимое строки от её начала и до первой попавшейся скобки, а второй же, учитывает всё от начала и до некоторых цифр перед той самой первой скобкой, вот эти различия и несоответствия поиска (ожидаемого результата) нужно учитывать, а если эти различия будут постоянно меняться, то и вычеслить закономерность будет сложнее.

Пример из моего сообщения подходит?
 
Автор
I

invisible

Новичок
Сообщения
5
Репутация
0
Код:
"(?s)(.+).*\D(\d+)/(\d+).*"


.*\D(\d+)/(\d+).* - этим условием я определяю номер порта и платы они разделены / (КРС АТС-10 8*9 (9,) 5-6(Isam1) 7/9 (AnnxA))
(.+) - а вместо этого куска мне бы хотелось придумать какое-нибудь условие, чтобы получался из КРС К58\7 7 (44,256) 8-6(Isam1) 5/48 (AnnxA)
КРСК58\77(Isam1)
Ваш пример к сожалению не подошел.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
invisible [?]
вместо этого куска мне бы хотелось придумать какое-нибудь условие, чтобы получался из
Не получится.

Ваш пример к сожалению не подошел
Но с двумя приведёнными строками он ведь работает?
Приведите тогда строки с которыми этот метод не работает.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
invisible [?]
Ваш пример к сожалению не подошел.
А так :
Код:
$sText="КРС К58\7 7  (44,256) 8-6(Isam1) 5/48 (AnnxA)" & @CRLF & "КРС АТС-10 8*9  (9,) 5-6(Isam1) 7/9 (AnnxA)"

$sPattern="\s?(\D+\d+\\?\d+?)\s(\d[^*])?.*(\(\D+\d\)).*"
$aRez=StringRegExp ( $sText, $sPattern , 3)
$sRez1=$aRez[0]&$aRez[1]&$aRez[2]
$sRez2=$aRez[3]&$aRez[4]&$aRez[5]

MsgBox(0,'Rezult',$sRez1  & @CRLF & $sRez2)




Добавлено:
Сообщение автоматически объединено:

Или для поиска в каждой строке :
Код:
$sText1="КРС К58\7 7  (44,256) 8-6(Isam1) 5/48 (AnnxA)"
$sText2="КРС АТС-10 8*9  (9,) 5-6(Isam1) 7/9 (AnnxA)"
$sPattern="\s?(\D+\d+\\?\d+?)\s(\d[^*])?.*(\(\D+\d\)).*"
$sRez1=StringRegExpReplace ( $sText1, $sPattern ,"\1\2\3")
$sRez2=StringRegExpReplace ( $sText2, $sPattern ,"\1\2\3")
MsgBox(0,'Rezult',$sRez1  & @CRLF & $sRez2)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
Это тот же метод (условие поиска) что использовал я, просто это менее “жадное” выражение
Похоже так .


Илия я тупой или...
Прочитал условия задания и только на 10 раз понял что же все таки требуется :laugh:
invisible [?]
.*\D(\d+)/(\d+).* - этим условием я определяю номер порта и платы они разделены / (КРС АТС-10 8*9 (9,) 5-6(Isam1) 7/9 (AnnxA))
(.+) - а вместо этого куска мне бы хотелось придумать какое-нибудь условие, чтобы получался из КРС К58\7 7 (44,256) 8-6(Isam1) 5/48 (AnnxA)
КРСК58\77(Isam1
Похоже требуется в одном выражении получить массив всех фрагментов :
Код:
КРСК58\77(Isam1)
номер порта
номер платы
Тогда так :
Код:
#include <Array.au3>
$sText="КРС К58\7 7  (44,256) 8-6(Isam1) 5/48 (AnnxA)" & @CRLF & "КРС АТС-10 8*9  (9,) 5-6(Isam1) 7/9 (AnnxA)"
$sText=StringReplace(StringStripWS(StringReplace($sText,@CRLF,"--"), 8),"--",@CRLF)
$sPattern="(.*?)(?:\d\*\d)?\([\d,]*\)\d\D\d\((.+)\)(\d)\D(\d+)\("
$aRez=StringRegExp ( $sText, $sPattern , 3)
_ArrayDisplay($aRez)

Правда есть недостаток: :
Код:
КРС .......
Isam1
номер порта
номер платы
Isam1 находится в отдельном элементе массива
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
И все же получилось : (для текста из нескольких строк)
Код:
#include <Array.au3>
$sText="КРС К58\7 7  (44,256) 8-6(Isam1) 5/48 (AnnxA)" & @CRLF & "КРС АТС-10 8*9  (9,) 5-6(Isam1) 7/9 (AnnxA)"
$sText=StringStripWS($sText, 8)
$sPattern="(?s)(?:\d\*\d)?\(\d*?,\d*?\)\d\D\d"
$sPattern1="(?s)(.*?\))(\d)\D(\d+)\(.*?\)"
$aRez=StringRegExp(StringRegExpReplace($sText,$sPattern,''),$sPattern1,3)
_ArrayDisplay($aRez)

Для одной строки (построчный выбор) Рег. выражение еще упростится :
Код:
#include <Array.au3>
$sStr1=StringStripWS("КРС К58\7 7  (44,256) 8-6(Isam1) 5/48 (AnnxA)",8)
$sStr2=StringStripWS("КРС АТС-10 8*9  (9,) 5-6(Isam1) 7/9 (AnnxA)", 8)
$sPattern="(?:\d\*\d)?\(.*?,.*?\)\d\D\d"
$sPattern1="(.*)(\d+)/(\d+)"
$aRez1=StringRegExp(StringRegExpReplace($sStr1,$sPattern,''),$sPattern1,3)
_ArrayDisplay($aRez1)
$aRez2=StringRegExp(StringRegExpReplace($sStr2,$sPattern,''),$sPattern1,3)
_ArrayDisplay($aRez2)
 
Автор
I

invisible

Новичок
Сообщения
5
Репутация
0
всем большое спасибо за помощь, решил проблему вот таким методом
Код:
;var
 ;КРС АТС-55 8*7  (19,) 1-2(isam3) 3/19 (AnnxA)
 ;КРС К52\3 3  (31,127) 1-1(Isam1) 3/31 (AnnxA)
 ;КРС К-5 АТС-36 1*2  (8,) 1-1(Isam1) 2/9 (AnnxA)
 
$buff = ClipGet()
$A = StringRegExp(StringStripWS($buff, 4), "КРС ((?U).+) .+((?U)\d-\d).+\D(\d+)/(\d+).*", 1)

;IniWrite($IniFile, "", "", $A[0] &" "& $A[1])

MsgBox("", "", $A[0] &" "& $A[1])
MsgBox("", "", $A[2])
MsgBox("", "", $A[3])

тему считаю решенной
 
Верх