Что нового

Парсинг строки и замена в ней данных регуляркой

Firestarter

Новичок
Сообщения
54
Репутация
0
Добрый день. Вечно у меня с регулярками проблема. Нагуглить толком ничего не смог, поэтому прошу подсказать мне.

Итак есть текст вида:
Код:
$t='jiv:korova,ves:500,550,600,eda:200,temps:70,50,60,54,55,fans:0,0,0,|||jiv:bik,ves:400,450,500,eda:150,temps:70,50,56,fans:1,2,3,4,|||jiv:yak,ves:200,250,300,eda:100,150,temps:70,fans:5,'


нужно привести к такому виду:
Код:
$t='jiv:korova,ves:500,550,600,eda:200,temps:70 50 60 54 55 ,fans:0 0 0|||jiv:bik,ves:400,450,500,eda:150,temps:70 50 56,fans:1 2 3 4|||jiv:yak,ves:200,250,300,eda:100,150,temps:70,fans:5'


т.е. в строке везде где встречается "temps:70,50,60,54,55,fans:0,0,0,", запятые заменить на пробелы. кол-во "temps и fans" может различаться по длине как видно.

спасибо)
 

Norm

Продвинутый
Сообщения
291
Репутация
76
Я сделал бы так:
Код:
Local $sRegex = "temps:[0-9,]+fans:[0-9,]+"
Local $sString = "jiv:korova,ves:500,550,600,eda:200,temps:70,50,60,54,55,fans:0,0,0,|||jiv:bik,ves:400,450,500,eda:150,temps:70,50,56,fans:1,2,3,4,|||jiv:yak,ves:200,250,300,eda:100,150,temps:70,fans:5,"
ConsoleWrite($sString & @CRLF)
Local $aArray = StringRegExp($sString, $sRegex, 3)
For $nN = 0 To UBound($aArray)-1
    $sString = StringReplace($sString, $aArray[$nN], StringReplace(StringTrimRight(StringReplace($aArray[$nN], ",", " "),1), " f", " ,f"))
Next
ConsoleWrite($sString & @CRLF)
 
Последнее редактирование:
Автор
F

Firestarter

Новичок
Сообщения
54
Репутация
0
Я сделал бы так:
Спасибо, то, что нужно!) лайкосик
Сообщение автоматически объединено:

и еще можно ли добавить в скрипт
дробные числа не парсятся((
1691925322951.png
Сообщение автоматически объединено:

и в самом конце убрать с конца все после последнего пробела включая сам пробел
1691925449352.png
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
291
Репутация
76
Покажите пример строки с дробными числами и концовкой до и после обработки
 
Автор
F

Firestarter

Новичок
Сообщения
54
Репутация
0
"jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796"
вконце "822681 и тд" уже не нужно
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
291
Репутация
76
Код:
Local $sString, $sRegex = "(?:hashes|temps|fans):[0-9,.]+"
;$sString = "jiv:korova,ves:500,550,600,eda:200,temps:70,50,60,54,55,fans:0,0,0,|||jiv:bik,ves:400,450,500,eda:150,temps:70,50,56,fans:1,2,3,4,|||jiv:yak,ves:200,250,300,eda:100,150,temps:70,fans:5,"
$sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796"
ConsoleWrite($sString & @CRLF)
Local $aArray = StringRegExp($sString, $sRegex, 3)
For $nN = 0 To UBound($aArray)-1
    $sString = StringReplace($sString, $aArray[$nN], StringTrimRight(StringReplace($aArray[$nN], ",", " "),1) & (StringRegExp(StringTrimRight($aArray[$nN], 1), "t|h") ? " ," : ""))
Next
$sString = StringRegExpReplace($sString, "(.+fans:[0-9\h]+)(\h\H+|)$", "$1")
ConsoleWrite($sString & @CRLF)
 
Последнее редактирование:
Автор
F

Firestarter

Новичок
Сообщения
54
Репутация
0
Спасибо, все хорошо но есть маленькое уточнение.

Код:
$sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0[B],81134,farm_id:1796[/B]!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0[B],8226814,farm_id:1796[/B]!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,4562221,farm_id:1796"


нужно чтобы в середине текста тоже удаляло выделенный текст, а то сейчас только в самом конце последний удаляет.
можно привязать к разделителю, он всегда состоит из пяти "!" знаков.
Сообщение автоматически объединено:

$sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,81134,farm_id:1796!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,4562221,farm_id:1796"
Сообщение автоматически объединено:

Вроде верно все я сделал? посмотрите пожалуйста. Как то долговато стал парсить файл.

Код:
For $nN = 0 To UBound($Array)-1
$o = StringReplace($o, $Array[$nN], StringTrimRight(StringReplace($Array[$nN], ",", " "),1) & (StringRegExp(StringTrimRight($Array[$nN], 1), "t|h") ? " ," : ""))
$o = StringRegExpReplace($o, "(.+fans:[0-9\h]+)(\h\H+|)!!!!!", "$1!!!!!")
Next
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
291
Репутация
76
т.е. в строке везде где встречается "temps:70,50,60,54,55,fans:0,0,0,", запятые заменить на пробелы. кол-во "temps и fans" может различаться по длине как видно.
и в самом конце убрать с конца все после последнего пробела включая сам пробел
нужно чтобы в середине текста тоже удаляло выделенный текст, а то сейчас только в самом конце последний удаляет.
можно привязать к разделителю, он всегда состоит из пяти "!" знаков.
Что-то с каждым вашим сообщением, задание всё больше и больше отличается от первоначалъного.:bomb:

Возможно есть более изящное решение, но по быстрому могу предложить только это.
Код:
Local $sString, $sRegex = "(?:hashes|temps|fans):[0-9,.]+"
;$sString = "jiv:korova,ves:500,550,600,eda:200,temps:70,50,60,54,55,fans:0,0,0,|||jiv:bik,ves:400,450,500,eda:150,temps:70,50,56,fans:1,2,3,4,|||jiv:yak,ves:200,250,300,eda:100,150,temps:70,fans:5,"
;$sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796"
$sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,81134,farm_id:1796!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,4562221,farm_id:1796"

ConsoleWrite($sString & @CRLF)
Local $aArray2, $aArray1 = StringRegExp($sString, "(?m)(?:jiv:korova).+?(?:!!!!!|$)", 3)
$sString = ""
If Not @error Then
    For $nJ = 0 To UBound($aArray1)-1
        $aArray2 = StringRegExp($aArray1[$nJ], $sRegex, 3)
        For $nN = 0 To UBound($aArray2)-1
            $aArray1[$nJ] = StringReplace($aArray1[$nJ], $aArray2[$nN], StringTrimRight(StringReplace($aArray2[$nN], ",", " "),1) & (StringRegExp(StringTrimRight($aArray2[$nN], 1), "t|h") ? " ," : ""))
        Next
        $sString &= StringRegExpReplace($aArray1[$nJ], "(.+fans:[0-9\h]+)\h\H+?(!!!!!|$)", "$1$2")
    Next
Else
   $sString = "Error "& @error
EndIf
ConsoleWrite($sString & @CRLF)
 
Последнее редактирование:
Автор
F

Firestarter

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

Norm

Продвинутый
Сообщения
291
Репутация
76
Вот более простое решение (см. ниже)
я не был совсем уверен, что должно оставаться перед "!!!!!", поэтому поставил " ," -> точнее " ,$1"
Код:
;Local $sString = "jiv:korova,ves:500,550,600,eda:200,temps:70,50,60,54,55,fans:0,0,0,|||jiv:bik,ves:400,450,500,eda:150,temps:70,50,56,fans:1,2,3,4,|||jiv:yak,ves:200,250,300,eda:100,150,temps:70,fans:5,"
;Local $sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796"
Local $sString = "jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,81134,farm_id:1796!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,8226814,farm_id:1796!!!!!jiv:korova,ves:500,550,600,eda:200,hashes:2.0339,2.0438,1.9858,1.573,1.9535,1.6216,2.0388,1.9765000000000001,temps:70,50,60,54,60,55,59,56,fans:0,0,0,0,0,0,0,0,4562221,farm_id:1796"

ConsoleWrite($sString & @CRLF)

Local $sRegex = "(?:hashes|temps|fans):[0-9,.]+"
Local $aArray = StringRegExp($sString, $sRegex, 3)
For $nN = 0 To UBound($aArray)-1
    $sString = StringReplace($sString, $aArray[$nN], StringTrimRight(StringReplace($aArray[$nN], ",", " "),1) & (StringRegExp(StringTrimRight($aArray[$nN], 1), "t|h") ? " ," : ""))
Next
$sString = StringTrimRight(StringRegExpReplace($sString, "\h\H+?(!+|\Z)", " ,$1"),2)

ConsoleWrite($sString & @CRLF)
 
Последнее редактирование:
Верх