Что нового

[Данные, строки] Разобрать данные с помощью рег. выражений

Pavel

Новичок
Сообщения
125
Репутация
3
Версия AutoIt: 3.3.12.0

Описание: прошу помочь разобрать данные по переменным с помощью регулярных выражений. Сам я это дело проклял, но обязательно изучу Ваш код и проникнусь на будущее :smile:
Данные можно брать из буфера обмена. Формат данных:

Код:
[robot_content][zakaz_number]805651[/zakaz_number][deliv]Доставка =0[/deliv][cart] ||Тестовый товар 1|111|1|111||Тестовый товар 2|58|1|58||Тестовый товар N|61|1|61[/cart][discount]5[/discount][itog]2560[/itog][fio]Тест5[/fio][tel]+7(922)-222-2222[/tel][email][email protected][/email][addr]Тестулица 1, кв. 4 Подъезд: 2, этаж: 3[/addr][comment]Тест5![/comment][/robot_content]

Примечания: данные из тега [cart][/cart] желательно взять не в переменную, а в массив:
НаименованиеЦенаКол-воСумма
Тестовый товар 11111111
Тестовый товар 2.........

:beer:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если символы постоянны, то можно так
Код:
#include <array.au3>
#include <string.au3>
$text = '[robot_content][zakaz_number]805651[/zakaz_number][deliv]Доставка =0[/deliv][cart] ||Тестовый товар 1|111|1|111||Тестовый товар 2|58|1|58||Тестовый товар N|61|1|61[/cart][discount]5[/discount][itog]2560[/itog][fio]Тест5[/fio][tel]+7(922)-222-2222[/tel][email][email protected][/email][addr]Тестулица 1, кв. 4 Подъезд: 2, этаж: 3[/addr][comment]Тест5![/comment][/robot_content]'
Local $array[0][4]
$strbt = _StringBetween($text, '[cart] ||', '[/cart]')
$strs = StringSplit($strbt[0], '||', 1)
$ind = 0
For $i = 1 To $strs[0]
	$strres = StringSplit($strs[$i], '|', 1)
	ReDim $array[$ind + 1][4]
	$array[$ind][0] = $strres[1]
	$array[$ind][1] = $strres[2]
	$array[$ind][2] = $strres[3]
	$array[$ind][3] = $strres[4]
	$ind += 1
Next
_ArrayDisplay($array, 'Result', '', 64, Default, 'Наименование|Цена|Кол-во|Сумма')
 
Автор
P

Pavel

Новичок
Сообщения
125
Репутация
3
А данные из других тегов можно попросить разобрать в один массив, или в разные переменные?
Чтобы темку пометить как решённую :smile:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
можно. какие теги?
 
Автор
P

Pavel

Новичок
Сообщения
125
Репутация
3
Все теги (кроме [cart] — его мы берём в отдельный массив кодом выше).
Можно взять по аналогии, чтобы не запутаться:
Код:
$sZakaz_number, $sDevil

С другой стороны формат ужасен (sDevil — вообще ад), поэтому можно сделать один массив для всех данных и внести их последовательно:
805651
Доставка =0
5
...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
зачем последовательно? можно как и предыдущий
Код:
#include <array.au3>
#include <string.au3>
$text = '[robot_content][zakaz_number]805651[/zakaz_number][deliv]Доставка =0[/deliv][cart] ||Тестовый товар 1|111|1|111||Тестовый товар 2|58|1|58||Тестовый товар N|61|1|61[/cart][discount]5[/discount][itog]2560[/itog][fio]Тест5[/fio][tel]+7(922)-222-2222[/tel][email][email protected][/email][addr]Тестулица 1, кв. 4 Подъезд: 2, этаж: 3[/addr][comment]Тест5![/comment][/robot_content]'
$strbt = _StringBetween($text, '[zakaz_number]', '[/zakaz_number]')
$strbt1 = _StringBetween($text, '[deliv]', '[/deliv]')
Local $array[0][2]
$ind = 0
For $i = 0 To UBound($strbt) - 1
	ReDim $array[$ind + 1][2]
	$array[$ind][0] = $strbt[$i]
	$array[$ind][1] = $strbt1[$i]
	$ind += 1
Next
_ArrayDisplay($array, 'Result', '', 64, Default, 'Номер заказа|Доставка')
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Мой вариант:
Код:
#include <Array.au3>

Local $Text = '[robot_content][zakaz_number]805651[/zakaz_number][deliv]Доставка =0[/deliv][cart] ||Тестовый товар 1|111|1|111||Тестовый товар 2|58|1|58||Тестовый товар N|61|1|61[/cart][discount]5[/discount][itog]2560[/itog][fio]Тест5[/fio][tel]+7(922)-222-2222[/tel][email][email protected][/email][addr]Тестулица 1, кв. 4 Подъезд: 2, этаж: 3[/addr][comment]Тест5![/comment][/robot_content]'

Local $aAllArr = StringRegExp($Text, '(Тестовый товар \w+)\|(\w+)\|(\w+)\|(\d+)', 3), $aArrayRes[0][4], $j = 0

Local $aArrLast = StringSplit(StringRegExpReplace($Text, '\[.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]\[.+?\](.+?)\[\/.+?\]$', '$1|$2|$4|$5|$6|$7|$8|$9|$10'), '|')

For $i = 0 To (UBound($aAllArr)-1)/4
    ReDim $aArrayRes[UBound($aArrayRes)+1][4]
    $aArrayRes[$i][0] = $aAllArr[$j]
    $aArrayRes[$i][1] = $aAllArr[$j+1]
    $aArrayRes[$i][2] = $aAllArr[$j+2]
    $aArrayRes[$i][3] = $aAllArr[$j+3]
    $j+=4
Next

_ArrayDisplay($aArrayRes)
_ArrayDisplay($aArrLast)
 
Автор
P

Pavel

Новичок
Сообщения
125
Репутация
3
Ребят, спасибо большое!
Сэкономили мне день-два разборок.
:IL_AutoIt_1:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
ivsatel
Ужас. Почитай что такое повторения
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Вопрос ко всем участникам темы.
Скажите, вам текст ниже ничего не напоминает?
Код:
[robot_content]
   [zakaz_number]805651[/zakaz_number]
   [deliv]Доставка =0[/deliv]
   [cart] ||Тестовый товар 1|111|1|111||Тестовый товар 2|58|1|58||Тестовый товар N|61|1|61[/cart]
   [discount]5[/discount]
   [itog]2560[/itog]
   [fio]Тест5[/fio]
   [tel]+7(922)-222-2222[/tel]
   [email][email protected][/email]
   [addr]Тестулица 1, кв. 4 Подъезд: 2, этаж: 3[/addr]
   [comment]Тест5![/comment]
[/robot_content]

Уверен напоминает!
Я конечно понимаю что регулярные выражения вещь хорошая, так почему бы нам не использовать их по прямому назначению. ;)
Код:
#include<Array.au3>

$sData = '[robot_content][zakaz_number]805651[/zakaz_number][deliv]Доставка =0[/deliv][cart] ||Тестовый товар 1|111|1|111||Тестовый товар 2|58|1|58||Тестовый товар N|61|1|61[/cart][discount]5[/discount][itog]2560[/itog][fio]Тест5[/fio][tel]+7(922)-222-2222[/tel][email][email protected][/email][addr]Тестулица 1, кв. 4 Подъезд: 2, этаж: 3[/addr][comment]Тест5![/comment][/robot_content]'

$sXML = StringRegExpReplace($sData, '\[([^\]]*)\]', '<$1>')

$oObj = ObjCreate("MSXml2.DOMDocument")
$oObj.LoadXML($sXML)
$oObj.setProperty('SelectionLanguage', 'XPath')

$sNodes = $oObj.selectNodes('/robot_content/*')

For $i = 0 To $sNodes.length -1

   If $sNodes.item($i).nodeName = 'cart' Then
	  $aTmp = StringSplit(StringTrimLeft($sNodes.item($i).text, 2), '||', 1)
	  Local $aCart[$aTmp[0]][4]
	  For $r = 1 To $aTmp[0]
		 $aTmp2 = StringSplit($aTmp[$r], '|', 1)
		 For $c = 1 To $aTmp2[0]
			$aCart[$r-1][$c-1] = $aTmp2[$c]
		 Next
	  Next
	  Assign($sNodes.item($i).nodeName, $aCart)
	  ContinueLoop
   EndIf

   Assign($sNodes.item($i).nodeName, $sNodes.item($i).text)
Next

ConsoleWrite(StringFormat('! zakaz_number = %s\r\n' _
						 &'! deliv = %s\r\n' _
						 &'! cart = %s[%d][%d]\r\n' _
						 &'! discount = %s\r\n' _
						 &'! itog = %s\r\n' _
						 &'! fio = %s\r\n' _
						 &'! tel = %s\r\n' _
						 &'! email = %s\r\n' _
						 &'! addr = %s\r\n' _
						 &'! comment = %s\r\n', _
						   $zakaz_number, _
						   $deliv, _
						   VarGetType($cart), _
						   UBound($cart, 1), _
						   UBound($cart, 2), _
						   $discount, _
						   $itog, _
						   $fio, _
						   $tel, _
						   $email, _
						   $addr, _
						   $comment))

_ArrayDisplay($cart, '> cart')

P.S. Пойми, студент, сейчас к людям надо помягче, а на вопросы смотреть ширше.
/Операция "Ы"/ :smile:
 
Верх