Что нового

StringRegExp - целое или дробное значение

Sakuzo

Новичок
Сообщения
4
Репутация
0
Моя задача: Достать минимальное и максимальное значение с сайта.
Вопрос: Как с помощью StringRegExp это реализовать, значение меняется, оно может быть дробным, а может быть целым.
1625074054869.png
1625074110664.png
Никак не могу до конца понять регулярные выражения и их принцип работы, сейчас реализовал выполнение только с дробной частью, но когда значение меняется на целое всё ломается...
Код:
$Value = $oIE.document.getElementsByClassName("infobar_line_value").item(4).innerText ; Жизненная энергия.
$Transformation = StringRegExp($Value, '\d+\.\d+', 1) ; Первое число с точкой. (Минимальное)
$Transformation[0] = StringRegExpReplace($Transformation[0], '\.', '') ; Убираем точку.
$Parameters[4][0] = $Transformation[0] ; Присвоение в массив.
$Transformation = StringRegExp($Value, '\s\d+\.\d+', 1) ; Второе число с точкой. (Максимальное)
$Transformation[0] = StringRegExpReplace($Transformation[0], '\.|\s', '') ; Убираем точку и пробел.
$Parameters[4][1] = $Transformation[0] ; Присвоение в массив.

Уже несколько часов ломаю голову как это реализовать, но так и не нашёл нужной информации, до этого искал как получить целое число из дробного с помощью StringRegExp, понял что никак, сделал через StringRegExpReplace.
Если можно с пошаговым комментарием, мне бы понять ;D
Сообщение автоматически объединено:

Ладно, сам разобрался ;D
Код:
$Transformation = StringRegExp($Value, "\d+\.?\d+", 1)

Но если где-то можно сделать лучше и не использовать StringRegExpReplace, просьба написать :smile:
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Но если где-то можно сделать лучше и не использовать StringRegExpReplace, просьба написать :smile:
Используйте группы для извлечения нужных вам значений.

regex101

Код:
;~ AutoIt Version: 3.3.14.5
;~ Author:         Tempo
#include <StringConstants.au3>
#include <Array.au3>

Global $aValues[] = ['4.422 / 9.500', '4.422 / 9500', '231 / 9.500', '231 / 9500']
Global $aParams[UBound($aValues) + 1][2] = [[0]], $aRegExp
For $sValue In $aValues
    $aRegExp = StringRegExp($sValue, '(\d+)\.?(\d*) \/ (\d+)\.?(\d*)', $STR_REGEXPARRAYMATCH)
    $aParams[0][0] += 1
    $aParams[$aParams[0][0]][0] = $aRegExp[0] & $aRegExp[1]
    $aParams[$aParams[0][0]][1] = $aRegExp[2] & $aRegExp[3]
Next
_ArrayDisplay($aParams)
 
Автор
Sakuzo

Sakuzo

Новичок
Сообщения
4
Репутация
0
Используйте группы для извлечения нужных вам значений.

regex101

Код:
;~ AutoIt Version: 3.3.14.5
;~ Author:         Tempo
#include <StringConstants.au3>
#include <Array.au3>

Global $aValues[] = ['4.422 / 9.500', '4.422 / 9500', '231 / 9.500', '231 / 9500']
Global $aParams[UBound($aValues) + 1][2] = [[0]], $aRegExp
For $sValue In $aValues
    $aRegExp = StringRegExp($sValue, '(\d+)\.?(\d*) \/ (\d+)\.?(\d*)', $STR_REGEXPARRAYMATCH)
    $aParams[0][0] += 1
    $aParams[$aParams[0][0]][0] = $aRegExp[0] & $aRegExp[1]
    $aParams[$aParams[0][0]][1] = $aRegExp[2] & $aRegExp[3]
Next
_ArrayDisplay($aParams)
Сайт огонь, наглядно наконец-то разобрался с регулярками. Вот что получилось.
Код:
$Value = $oIE.document.getElementsByClassName("infobar_line_value").item(4).innerText ; Жизненная энергия.
$Transformation = StringRegExp($Value, '(\d+)\.?(\d*) \/ (\d+)\.?(\d*)|(\d+)\.?(\d*)', 1) ; Присвоение найденных чисел в массив.
$Parameters[4][0] = $Transformation[0] & $Transformation[1] ; Присвоение в массив.
$Parameters[4][1] = $Transformation[2] & $Transformation[3] ; Присвоение в массив.

По группам действительно удобнее, кое что ещё добавил, оказывается иногда исходное значение бывает одно.
 
Верх