Что нового

Как сделать Инверсию Regexp-a?

jojocague

Новичок
Сообщения
7
Репутация
0
Есть такой текст:
Autoloaded 1 filter(s).
Frame 20204 (0:11:14.140) [ ]

для него применяю regexp:
[\(][0-9][:][0-9][0-9][:][0-9][0-9][.][0-9][0-9][0-9][\)]
Он тогда находит:
(0:11:14.140)
Мне надо, что бы он находил инверсию, то есть все кроме этого выражения..

И еще вопросик на засыпку:
Почему функция StringRegExp при флаге 1,2,3,4 не возвращает массив, а пустоту при вызове результата с помощью msgbox?
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Код:
#include 'array.au3'
$file='Frame 20204 (0:11:14.140)'
$file&='Frame 20204 (0:12:14.140)'
$file&='Frame 20204 (0:13:14.140)'
$str=StringRegExp($file,'Frame[^\(]+\(((?:(?!0:11:14.140)[^\(\)])+)',3)
_ArrayDisplay($str)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Схема простая.
Если у тебя есть паттерн pattern, то инверсия к нему строится как
Код:
(?(?=pattern)(FAIL)|.+?)

Понятно что тебе ещё нужно описать окружение вокруг этого участка.

Код:
#include <Array.au3>

$text = "Autoloaded 3 filter(s)."
$text &= @CRLF&"Frame 20204 (0:11:14.140)"
$text &= @CRLF&"Frame 20204 (0:12:14.140)"
$text &= @CRLF&"Frame 20204 (0:13:14.140)"

$pattern = "(?m)^Frame\s20204\s(\((?(?=0:11:14\.140)(FAIL)|.+?)\))"

$aRes=StringRegExp($text, $pattern, 3)
_ArrayDisplay($aRes)
 
Автор
J

jojocague

Новичок
Сообщения
7
Репутация
0
C2H5OH сказал(а):
Схема простая.
Если у тебя есть паттерн pattern, то инверсия к нему строится как
Код:
(?(?=pattern)(FAIL)|.+?)

Понятно что тебе ещё нужно описать окружение вокруг этого участка.

Код:
#include <Array.au3>

$text = "Autoloaded 3 filter(s)."
$text &= @CRLF&"Frame 20204 (0:11:14.140)"
$text &= @CRLF&"Frame 20204 (0:12:14.140)"
$text &= @CRLF&"Frame 20204 (0:13:14.140)"

$pattern = "(?m)^Frame\s20204\s(\((?(?=0:11:14\.140)(FAIL)|.+?)\))"

$aRes=StringRegExp($text, $pattern, 3)
_ArrayDisplay($aRes)

Проблема в том, что часть (0:11:14.140) всегда меняется (только цифры) и надо, что бы regexp понимал саму конструкцию типа
[\(][0-9][:][0-9][0-9][:][0-9][0-9][.][0-9][0-9][0-9][\)] и потом удалял весь остальной текст кроме найденого..
 
Автор
J

jojocague

Новичок
Сообщения
7
Репутация
0
InnI сказал(а):
jojocague
потом удалял весь остальной текст кроме найденого
Может проще заменить весь текст найденным массивом?

Я в программировании новичек, как и в autoit, так что незнаю всех возможных выриантов

Код:
$endVideoTime = WinGetText("[CLASS:VirtualDub]","Frame")
MsgBox(2,"22",$endVideoTime)
$endVideoTimeClear = StringRegExpReplace($endVideoTime,"[\(][0-9][:][0-9][0-9][:][0-9][0-9][.][0-9][0-9][0-9][\)]","")
MsgBox(2,"22",$endVideoTimeClear)


Вот кусок кода, который берет значение Visible Text:
Autoloaded 1 filter(s).
Frame 20204 (0:11:14.140) [ ]

Потом удаляет этот кусок (0:11:14.140), а надо инверсия т.к. при функции StringRegExp и флаге 1,2,3,4 возвращается пустота.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
jojocague
предоставьте пример: что на входе и что должно получиться.
 

InnI

AutoIT Гуру
Сообщения
4,983
Репутация
1,461
jojocague
возвращается пустота
Для просмотра массивов есть специальная функция _ArrayDisplay(). А чтобы просмотреть элемент массива, нужно указать его индекс
Код:
#include <Array.au3>
;~ $endVideoTime = WinGetText("[CLASS:VirtualDub]", "Frame")
$endVideoTime = "Autoloaded 1 filter(s)." & @CRLF & "Frame 20204 (0:11:14.140) [ ]"
$endVideoTimeClear = StringRegExp($endVideoTime, "\(\d:\d\d:\d\d\.\d\d\d\)", 1)
If Not @error Then
  _ArrayDisplay($endVideoTimeClear)
  MsgBox(0, "", $endVideoTimeClear[0])
EndIf
 
Автор
J

jojocague

Новичок
Сообщения
7
Репутация
0
C2H5OH сказал(а):
jojocague
предоставьте пример: что на входе и что должно получиться.

На входе:
Autoloaded 1 filter(s).
Frame 20204 (0:11:14.140) [ ]

На выходе:
(0:11:14.140)

При этом в части, которая остается (0:11:14.140) будут постоянно разные цифры.

InnI сказал(а):
jojocague
возвращается пустота
Для просмотра массивов есть специальная функция _ArrayDisplay(). А чтобы просмотреть элемент массива, нужно указать его индекс
Код:
#include <Array.au3>
;~ $endVideoTime = WinGetText("[CLASS:VirtualDub]", "Frame")
$endVideoTime = "Autoloaded 1 filter(s)." & @CRLF & "Frame 20204 (0:11:14.140) [ ]"
$endVideoTimeClear = StringRegExp($endVideoTime, "\(\d:\d\d:\d\d\.\d\d\d\)", 1)
If Not @error Then
  _ArrayDisplay($endVideoTimeClear)
  MsgBox(0, "", $endVideoTimeClear[0])
EndIf

Спасибо, теперь вижу результат, но возникает проблема номер 2 : как теперь с этого массива получить это значение и положить его в переменную.
 

InnI

AutoIT Гуру
Сообщения
4,983
Репутация
1,461
jojocague
как теперь с этого массива получить это значение и положить его в переменную
Я же написал как - обратиться по индексу
Код:
$var = $endVideoTimeClear[0]
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Код:
#include 'array.au3'
$file='Frame 20204 (0:11:14.140)'
$file&='Frame 20204 (0:12:14.140)'
$file&='Frame 20204 (zzz)'
$str=StringRegExp($file,'Frame[^\(]+\(((?:(?![0-9:.]+)[^\(\)])+)',3)
_ArrayDisplay($str)
 
Верх