Что нового

Распознавание различных текстовых сообщений внутри своего приложения

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Суть просто, хочу написать приложение (начало во вложении), где будет input, после введения команды в него, мне надо как-то её распарсить (на данный момент примитивный вариант реализован регэкспом). Проблема в том, что в инпут планируется добавлять совершенно разношерстные команды например:
PingList add 192.168.001.001 [ЗФС БУ-СГС] - эта команда сейчас принимается программой и создает в ListBox новую строку с введенными данными.
Команды повторюсь будут совершенно разношерстными
Scan local 192.168.1.1-150 (сосканировать опр участок локальной сети)
pinglist start monitor
pinglist on/off

И тд и тп, команды приведены чисто для примера понимания что они будут не шаблонными. Как реализовать работу с GUI и сами функции я знаю.

Помогите с регэкспами. Или может кто-то реализовывал нечто подобное другими работающими способами.
Тестовая функция принимающая текстовую команду выглядит так:
Код:
Func _button_Execute()
	Local $msg = GUICtrlRead($input_CMD)
	If $msg="" Then Return
;~ 	$var = "PingList add"
	$pattern = "(.*?PingList).(.*?add).(.*?[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]).\[(.*?)\]"
	$res = StringRegExp($msg, $pattern, 2)
	If Not @error Then
;~ 		MsgBox(0,0,$res[1])
;~ 		MsgBox(0,0,$res[2])
;~ 		MsgBox(0,0,$res[3])
		$var = _GUICtrlListView_GetItemCount($listview_PingList)
		_GUICtrlListView_AddItem($listview_PingList, $var+1)
;~ 		_GUICtrlListView_AddSubItem($listview_PingList, 0, $res[2], 1)
		_GUICtrlListView_AddSubItem($listview_PingList, $var, $res[3], 3)
		_GUICtrlListView_AddSubItem($listview_PingList, $var, $res[4], 2)
		_GUICtrlListView_SetColumnWidth($listview_PingList, 0, $LVSCW_AUTOSIZE)
		_GUICtrlListView_SetColumnWidth($listview_PingList, 1, $LVSCW_AUTOSIZE)
		_GUICtrlListView_SetColumnWidth($listview_PingList, 2, $LVSCW_AUTOSIZE)
		_GUICtrlListView_SetColumnWidth($listview_PingList, 3, $LVSCW_AUTOSIZE)
		_GUICtrlListView_SetColumnWidth($listview_PingList, 4, $LVSCW_AUTOSIZE)
		_GUICtrlListView_SetColumnWidth($listview_PingList, 5, $LVSCW_AUTOSIZE)
		
	EndIf
;~ 	$var = StringReplace($msg, "/PingList ", "")
;~ 	If @extended = 1 Then 
;~ 		MsgBox(0,0,"["&$var&"]")
;~ 	EndIf
EndFunc
 

Вложения

  • LAN CON.rar
    10.9 КБ · Просмотры: 3

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: Распознавание различных текстовых внутри своего приложения

Когда разбирался с рекурсивными шаблонами, натрапыв на вот такой пример описания субрутины.
Хороший пример, мне понравился. :smile:
Приводится шаблон как раз для нахождения валидного ip-шника.
Used without no-pattern, permits definition of a subroutine useable from elsewhere. "(?x) (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )" defines a subroutine named "byte" which matches any component of an IPv4 address. Then an actual address can be matched by "\b (?&byte) (\.(?&byte)){3} \b".

Вот так вроде бы
Код:
$pattern = "(?x)(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))(.*?PingList).(.*?add).(.*?(?&byte)(\.(?&byte)){3}).\[(.*?)\]"


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


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

Код:
$sDefCommand = "(?(DEFINE)(?<command>PingList|Scan))"
$sDefKey = "(?(DEFINE)(?<key>add|start monitor|on\/off|local))"
$sDefByte = "(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))"
$pattern = "(?x)"&$sDefCommand&$sDefKey&$sDefByte&"(.*?(?&command)).(.*?(?&key)).(.*?(?&byte)(\.(?&byte)){3})(\-(?&byte)|.)(.*?)"
$res = StringRegExp($msg, $pattern, 2)


Одной ногой в дверях уже. Пробовать завтра буду))
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Распознавание различных текстовых внутри своего приложения

Оооо спасибо! Приду с работы буду пытаться понять как этот регэксп работает :smile:


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

Проблема решилась сама собой. На входящую команду я применяю StringSplit с пробелом-делителем, первое слово сую в Call, а оставшийся массив сую туда параметром. Принимающая функция, если существует, потрошит полученный параметр, в случае необходимости обрабатывая его регэкспом, но по сути необходимость регэкспов в моём случае теперь свелась на нет :smile:
 
Верх