Что нового

Извлечение из строки данных по признаку

musicstashall

Знающий
Сообщения
322
Репутация
7
Доброго.
Имеется строка, из которой в одном случае нужно получить hWnd, а в другом случае удалить из строки часть между символами «|», в которой содержится этот hWnd.
Код:
Local $stxt = 'Array[1][1];0x0000000000371B4E|Array[1][2];0x000000000008319E|Array[1][3];0x00000000000A31DE|Array[1][4];0x00000000000C3136'
; получить hWnd
$sSearch = 'Array[1][3]'
$hWnd = StringRegExp($stxt, 'pattern')
; лучше таким способом, чтобы обойтись без массивов
$hWnd = StringRegExpReplace($stxt, 'pattern')
; удалить промежуток
$hWnd = 0x00000000000A31DE
$stxt = StringRegExpReplace($stxt, 'pattern')


Для поиска hWnd имеем привязанный к hWnd параметр, например «Array[1][3]». Необходимо извлечь данные справа, следующие после символа «;» и до следующего символа «|».
Во втором случае ищем hWnd и удаляем весь промежуток между символами «|», в которой содержится этот hWnd, плюс удалить символ «|», чтобы они не копились в строке.
Прошу помощи.
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Привет! См. нечто, склёпанное «на табуретке».
Протокол запуска с Вашиси тестовыми данными:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\_Debug\msha-1.au3"     
Ok: key = 'Array[1][2]', hWnd = 0x000000000008319E
Ok: hWnd='00000000000A31DE', new string = 'Array[1][1];0x0000000000371B4E|Array[1][2];0x000000000008319E|AArray[1][4];0x00000000000C3136'
>Exit code: 0    Time: 0.1424
Понятно, что нужно всё это причесать, добавить дуракозащиту итп эстетство. Но «девушек — потом» © :acute:
 

Вложения

  • msha-1.au3
    9.4 КБ · Просмотры: 2
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Привет! См. нечто, склёпанное «на табуретке».
Протокол запуска с Вашиси тестовыми данными:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\_Debug\msha-1.au3"    
Ok: key = 'Array[1][2]', hWnd = 0x000000000008319E
Ok: hWnd='00000000000A31DE', new string = 'Array[1][1];0x0000000000371B4E|Array[1][2];0x000000000008319E|AArray[1][4];0x00000000000C3136'
>Exit code: 0    Time: 0.1424
Понятно, что нужно всё это причесать, добавить дуракозащиту итп эстетство. Но «девушек — потом» © :acute:
Благодарю любезно, приберу. Хотелось бы короче, в одном паттерне, в одну строку. Сможете?
 

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Благодарю любезно, приберу. Хотелось бы короче, в одном паттерне, в одну строку. Сможете?
Привет! Пока что только поиск в 2 вариантах: 1) через функцию попроще и 2) в лоб — не совсем «в одну строку», но что-то близкое к тому.
Поиск «в лоб» по корректному ключу:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\Forum\msha-2.au3"   
Ok: key = 'Array[1][2]', hWnd = 0x000000000008319E
>Exit code: 0    Time: 0.07534
Кривой ключ «в лоб» ожидаемо привёл к залёту:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\Forum\msha-2.au3"   
"D:\Alecsis\Prog\AutoIt\Forum\msha-2.au3" (69) : ==> Subscript used on non-accessible variable.:
$sHandle = StringRegExp($stxt, '\Q' & $sSearch & '\E;(0[xX][[:xdigit:]]+)', $STR_REGEXPARRAYMATCH)[0]
$sHandle = StringRegExp($stxt, '\Q' & $sSearch & '\E;(0[xX][[:xdigit:]]+)', $STR_REGEXPARRAYMATCH)^ ERROR
>Exit code: 1    Time: 0.08718
Сообщение автоматически объединено:


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

Привет ещё раз! Теперь изврат на тему замены, тоже в предположении, что с исх. данными всё Ok.
Рез-т «лётных испытаний»:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\Forum\MSHA\msha-3.au3"   
Ok: hWnd='0x00000000000A31DE', new string = 'Array[1][1];0x0000000000371B4E|Array[1][2];0x000000000008319E|Array[1][4];0x00000000000C3136'
>Exit code: 0    Time: 0.06588
PS1 Если где встретится #include <avLib.au3>, то можно убрать или закомментить
PS2 Imho, всё-таки логичней было бы упрятать поиск/замену в функции: 1) код становится понятнее, 2) меньше проблем с неизбежшыми модификациями; 3) проще реализовать дуракозащиту = повысить живучесть скрипта, ибо Законы Мэрфи никто не отменял :drinks:
 

Вложения

  • msha-2.au3
    3.5 КБ · Просмотры: 1
  • msha-3.au3
    2.5 КБ · Просмотры: 1
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
$stxt = 'Array[1][1];0x0000000000371B4E|Array[1][2];0x000000000008319E|Array[1][3];0x00000000000A31DE|Array[1][4];0x00000000000C3136'

; получить hWnd
$sSearch = 'Array[1][3]'
$hWnd = StringRegExp($stxt, StringReplace($sSearch, '[', '\[') & ';([^|]+)', 3)
$hWnd = @error ? 'not found' : $hWnd[0]
ConsoleWrite($hWnd & @CRLF)

; удалить промежуток
$hWnd = 0x00000000000A31DE
;~ $hWnd = '0x00000000000A31DE'
If IsInt($hWnd) Then $hWnd = '0x' & Hex($hWnd)
$stxt = StringRegExpReplace($stxt & '|', '[^|]+' & $hWnd & '\|', '')
$stxt = @extended ? StringTrimRight($stxt, 1) : 'not found'
ConsoleWrite($stxt & @CRLF)
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Уважаемые, а с помощью такого паттерна '[0-9A-Fa-f]{16}|[0-9A-Fa-f]{8}' не проще извлечь hWnd из строки?
Код:
Func __GethWnd($stxt, $sSub = '')
    Local $aData = StringRegExp($stxt, '[0-9A-Fa-f]{16}|[0-9A-Fa-f]{8}', 1, StringInStr($stxt, $sSub))
    If @error Then Return 0
    Return HWnd('0x' & $aData[0])
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
с помощью такого паттерна '[0-9A-Fa-f]{16}|[0-9A-Fa-f]{8}'
Шаблон создаётся под конкретные данные. Если вам нужен именно hWnd, то да, этот шаблон лучше. Но вы просили
извлечь данные справа, следующие после символа «;» и до следующего символа «|»
то есть любые данные. Поэтому тут вопрос, не что проще, а что корректнее в вашей ситуации.
 
Верх