Что нового

Логическая ИЛИ в регулярном выражении

TpeTTep

Новичок
Сообщения
45
Репутация
1
Доброго времени суток. При составлении регулярного выражения столкнулся с такой проблемой
Код:
StringRegExp($sResult[$i],'"positive": true.*?"value": ([-]?[0-9]*[.]?[0-9]+)|"value": ([-]?[0-9]*[.]?[0-9]+).*?"positive": true',3)

Мне нужно получить значение "value":. Строка "positive": true может быть как до этого значения, так и после. Я принял решение составить 2 шаблона, а перед ними использовать логическую или |, но дело в том, что помимо нужных мне значений в массив совпадений попадают пустые строки. Т.е если значений "value": нашлось 3 штуки, то размер массива будет 6, а сами значения будут чередоваться через пустые строки. Никак не пойму почему так происходит. Например эта конструкция возвращает либо null, либо число.
Код:
StringRegExp($sResult[$i],'"buyout_price": (null|\d+)

Т.е всё работает так, как и должно, но в данном примере логическая ИЛИ находится в пределах одной группы.
Сразу скажу, что с регулярными выражениями я работаю впервые, для меня это жуткие дебри, тем не менее все интересующие меня данные я всё же смог получить, осталось исправить только ранее описанный недочёт. Поможете?)
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Дайте пример строки которую нужно разобрать.
И вам принципиально через рег. выражения или нет?
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
IMStrelcov сказал(а):
Дайте пример строки которую нужно разобрать.
И вам принципиально через рег. выражения или нет?

Код:
{"value": 149.0, "positive": true, "url_name": "recoil"}
Но она может выглядеть и так
Код:
{"positive": true, "value": 149.0, "url_name": "recoil"}
Может ли перемещаться "url_name" я пока не знаю. Рег. выражения использовать желательно, т.к у меня весь скрипт на нём написан, так мне будет проще.



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

Вот пример того, что происходит. Т.е извлечённых значения 2, но помимо них в массив попадают ещё и пустые строки.
2019-06-29-124824.png

На самом деле можно было бы просто почистить массив от пустых строк и забить на это, но мне как минимум хочется понять что же я сделал не так.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$file='{"value": 149.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 148.1, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 147.1, "url_name": "recoil"}'& @CRLF
$file&='{"value": 146.0, "positive": true, "url_name": "recoil"}'& @CRLF
$str=StringRegExp($file,'(?(?="positive": true, "value": [^,:]+)"positive": true, "value": |"value": )([^,:]+)',3)
_ArrayDisplay($str)
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
наличие "positive": true обязательно проверять или нет?
если нет то так можно попробовать:
Код:
StringRegExp($sResult[$i],'.*?"value": ([-]?[0-9]*[.]?[0-9]+).*?',3)



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

sngr сказал(а):
Код:
#include 'array.au3'
$file='{"value": 149.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 148.1, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 147.1, "url_name": "recoil"}'& @CRLF
$file&='{"value": 146.0, "positive": true, "url_name": "recoil"}'& @CRLF
$str=StringRegExp($file,'(?(?="positive": true, "value": [^,:]+)"positive": true, "value": |"value": )([^,:]+)',3)
_ArrayDisplay($str)
Ввашем примере даже при наличии "positive": false все значения подхватываются.
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
sngr, Дело в том, что наличие "positive": true обязательно, а если заменить его значение на false, то он продолжает изымать значение из value, хотя не должен.

IMStrelcov, Да, positive обязательно должен быть true.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
TpeTTep сказал(а):
На самом деле можно было бы просто почистить массив от пустых строк и забить на это, но мне как минимум хочется понять что же я сделал не так.
Может быть у вас попадаются строки с "value":
но без значения/каких либо цифр после.
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
IMStrelcov сказал(а):
Может быть у вас попадаются строки с "value":
но без значения/каких либо цифр после.

Такого нет, там всегда есть какое-то число с плавающей точкой
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$file='{"value": 149.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 148.1, "url_name": "recoil"}'& @CRLF
$file&='{ "value": 147.1, "url_name": "recoil"}'& @CRLF
$file&='{"value": 146.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"value": 144.0, "positive": false, "url_name": "recoil"}'& @CRLF
$str=StringRegExp($file,'(?<="positive": true, "value":)[^:,]+|[^:,]+(?=, "positive": true)',3)
ConsoleWrite(@error & @LF)
_ArrayDisplay($str)
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
sngr, Хороший пример, но если между value и positive вклинить url_name, то вместо вместо значения он выдаст "recoil". Вот
Код:
#include 'array.au3'
$file='{"value": 149.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 148.1, "url_name": "recoil"}'& @CRLF
$file&='{ "value": 147.1, "url_name": "recoil"}'& @CRLF
$file&='{"value": 146.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"value": 144.0, "positive": false, "url_name": "recoil"}'& @CRLF
$file&='{"value": 145.0, "url_name": "recoil", "positive": true}'& @CRLF
$file&='{"url_name": "recoil", "value": 144.4, "positive": true}'& @CRLF
$str=StringRegExp($file,'(?<="positive": true, "value":)[^:,]+|[^:,]+(?=, "positive": true)',3)
ConsoleWrite(@error & @LF)
_ArrayDisplay($str)


Я уже говорил ранее, что пока не знаю может ли перемещаться url_name внутри строки или нет.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Тогда я вижу решение задачи пока только так:
Код:
#include 'array.au3'
$file='{"value": 149.0, "positive": true, "url_name": "recoil"}'& @CRLF
$file&='{"positive": true, "value": 148.1, "url_name": "recoil"}'& @CRLF
$file&='{"positive": false, "value": 147.1, "url_name": "recoil"}'& @CRLF
$file&='{"value": 146.0, "positive": false, "url_name": "recoil"}'& @CRLF

$str=StringRegExp($file,'\{(.*)*?\}',3)
Global $str2[UBound($str) +1]

For $i = 0 To UBound($str)-1
	If StringInStr($str[$i], '"positive": true') Then
		$str2[0] += 1
		$str2[$str2[0]]=StringRegExpReplace($str[$i], '(^.*?"value": )([-]?[0-9]*[.]?[0-9]+)(.*?)$', '$2')
	EndIf
Next

ReDim $str2[$str2[0] +1]

;в первом пункте массива будет содержатся размер массива $str2
_ArrayDisplay($str2)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$str=StringRegExp($file,'(?<="positive": true, "value":)[0-9.]+|[0-9.]+(?=, "positive": true)',3)
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
sngr сказал(а):
Код:
$str=StringRegExp($file,'(?<="positive": true, "value":)[0-9.]+|[0-9.]+(?=, "positive": true)',3)
Все варианты разтановки параметров в строке предусмотреть используя только одно рег. выражение не получится наверное.
На пример:
'{"value": 107.0, "url_name": "recoil", "positive": true}'
не отловит ваш пример.
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
sngr сказал(а):
Код:
$str=StringRegExp($file,'(?<="positive": true, "value":)[0-9.]+|[0-9.]+(?=, "positive": true)',3)
А теперь он не цепляет значение, если "positive": true находится перед value. В общем ладно, не хочу задалбывать, видимо действительно придётся чистить массив от пустых строк. Если говорить откровенно, то я вообще думал, что причина такого поведения заключается в какой ни будь банальной ошибке совершенной из-за собственной невнимательности. Но видимо не всё так просто.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
TpeTTep сказал(а):
... в массив совпадений попадают пустые строки...
Это не пустые строки, а вторые группы. Посмотрите ваш pattern в первом посте: сколько групп вы назначили для поиска? Пусть эти группы не найдены, но это все-таки группы, которые должны быть возвращены.

Мой вариант:
Код:
#include <Array.au3>
$sStr = '{"value": 000.1, "positive": false, "url_name": "recoil"}' & @CRLF & _
		'{"positive": true, "value": 111.1, "url_name": "recoil"}' & @CRLF & _
		'{ "value": 000.2, "url_name": "recoil"}' & @CRLF & @CRLF & _
		'{"url_name": "recoil", "positive": true, "value": 111.2}' & @CRLF & _
		'{"value": 111.3, "positive": true, "url_name": "recoil"}' & @CRLF & _
		'{"value": 000.3, "positive": false, "url_name": "recoil"}' & @CRLF & _
		'{"value": 111.4, "url_name": "recoil", "positive": true}' & @CRLF & _
		'{"url_name": "recoil", "value": 111.5, "positive": true}'

$aArray = StringRegExp($sStr, '(?i)(?<=positive":\htrue).+value":\h([\d.]+)|(?<=value":\h)[\d.]+(?=.+positive":\htrue)', 3)
_ArrayDisplay($aArray) ; <<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>
 
Верх