Что нового

RegExp Регулярка с условием

antiwinforever

Новичок
Сообщения
25
Репутация
0
Всем привет!
Помогите составить регулярное выражение.
Есть переменная с многострочным текстом. Нужно с помощью
Код:
StringRegExp($Text, "", 3)
выдернуть число из текста.
Но если в тексте присутствует фраза Привет мир, тогда число находится между одними тегами, а если нет то между другими.
Вот что у меня получилось:
Код:
(?(?=Привет мир)<strong>(\d+?)\h?\d*? </strong>|__fox_mor bit-fox">\s*(\d+?)\h?\d*? \s*<span class="fox-box__currency">)

Если есть привет мир, то текст выглядит так:
текст <strong>55555.55</strong> текст
если нет, то так:
текст __fox_mor bit-fox"> 555555.55 <span class="fox-box__currency"> текст
Число может быть с точкой и без. После и перед ним могут быть пробелы и переносы строк.
 

Norm

Продвинутый
Сообщения
269
Репутация
70
Не знаю, как ваш текст выглядит в реальности, но я бы сделал так:
Код:
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sString = 'текст' & @CRLF & _
                '<strong>1111.11</strong>' & @CRLF & _
                '<strong> 222222</strong>' & @CRLF & _
                '<strong> ' & @CRLF & _
                ' 33333.33 </strong>' & @CRLF & _
                '<strong> ' & @CRLF & _
                '  44444.44 ' & @CRLF & _
                '</strong>' & @CRLF & _
                '56789.875' & @CRLF & _
                'текст' & @CRLF & _
                '' & @CRLF & _
                'текст' & @CRLF & _
                '__fox_mor bit-fox"> 555555.55 <span class="fox-box__currency">' & @CRLF & _
                '__fox_mor bit-fox"> ' & @CRLF & _
                '66666.66 <span class="fox-box__currency">' & @CRLF & _
                '__fox_mor bit-fox"> 77777777 ' & @CRLF & _
                '<span class="fox-box__currency">' & @CRLF & _
                'текст'
Local $aArray = StringRegExp($sString, '(?m)(?:<strong>|bit-fox">)\h*\s*([\d.]+)', 3)
_ArrayDisplay($aArray, "Result")
 

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
Если просто найти все цифры, то:
Код:
$aArray=StringRegExp($sString,'(\d+(?:\.\d+)?)',3)
 
Автор
A

antiwinforever

Новичок
Сообщения
25
Репутация
0
Не знаю, как ваш текст выглядит в реальности, но я бы сделал так:
Код:
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sString = 'текст' & @CRLF & _
                '<strong>1111.11</strong>' & @CRLF & _
                '<strong> 222222</strong>' & @CRLF & _
                '<strong> ' & @CRLF & _
                ' 33333.33 </strong>' & @CRLF & _
                '<strong> ' & @CRLF & _
                '  44444.44 ' & @CRLF & _
                '</strong>' & @CRLF & _
                '56789.875' & @CRLF & _
                'текст' & @CRLF & _
                '' & @CRLF & _
                'текст' & @CRLF & _
                '__fox_mor bit-fox"> 555555.55 <span class="fox-box__currency">' & @CRLF & _
                '__fox_mor bit-fox"> ' & @CRLF & _
                '66666.66 <span class="fox-box__currency">' & @CRLF & _
                '__fox_mor bit-fox"> 77777777 ' & @CRLF & _
                '<span class="fox-box__currency">' & @CRLF & _
                'текст'
Local $aArray = StringRegExp($sString, '(?m)(?:<strong>|bit-fox">)\h*\s*([\d.]+)', 3)
_ArrayDisplay($aArray, "Result")
В этом случае она найдет любое из совпадений, а мне нужно:
Но если в тексте присутствует фраза Привет мир, тогда число находится между одними тегами, а если нет то между другими.
Т.е. оба варианта всегда есть в тексте, но если присутствует привет мир, то нужно искать по одному шаблону, а если нет, то по другому.
Причем это нужно сделать именно регуляркой, а не условием в коде.
 

Norm

Продвинутый
Сообщения
269
Репутация
70
Причем это нужно сделать именно регуляркой, а не условием в коде.
В чём проблема, если это через условие будет реализовано?
Встречается Привет мир в тексте регулярно?
Если нет, то ефективнее было бы сначала определить, есть Привет мир или нет и затем применить соответствующий шаблон.
 
Автор
A

antiwinforever

Новичок
Сообщения
25
Репутация
0
В чём проблема, если это через условие будет реализовано?
В хэлпе нашел возможность реализовать условие в самой регулярке, но не смог реализовать.
Просто очень не хочется менять логику работы программы. Очень много нужно переписывать.
Но раз никто не знает как это сделать, походу придется...
 
Верх