Что нового

[RegExp] ошибка в функции StringRegExp

damien2008

Осваивающий
Сообщения
178
Репутация
34
здравствуйте. есть вопрос:

функция:

Код:
Dim $ARRAY

Func _open()
	$var = FileOpenDialog($message, @ScriptDir & "\", "config (*.txt)", 1 + 4 )
If @error Then
    $ADDR = 0
Else
$ADDR = $var
_FileReadToArray($ADDR, $ARRAY)
For $i = 1 To UBound($ARRAY) - 1
    $ARRAY[$i] = StringRegExp($ARRAY[3], "^.*\:(.*)\;.*$", 3)  ;фамилия
    $ARRAY[$i] = StringRegExp($ARRAY[3],"^.*\:.*\;(.*)$", 3) ;имя
    Next
GUICtrlSetData($Input1, $ARRAY[3])
GUICtrlSetData($Input2, $ARRAY[3])
EndIf
EndFunc


после выполнения в $Input1 и $Input2 возвращает значение 1 , вместо
" фамилия " и " имя " соответственно.

третья строка в *.txt файле выглядит так:
д;анныеданныед;анныеданныеданные:фамилия;имя

что может быть не так?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
damien2008
У меня так работает:
Код:
$sText = 'д;анныеданныед;анныеданныеданные:фамилия;имя'

$sSurname = StringRegExpReplace($sText, '(?s).*?:(.*?);.*', '\1')
$sName = StringRegExpReplace($sText, '(?s).*?:.*?;(.*?)$', '\1')
MsgBox(0, '', $sSurname & ' - ' & $sName)

$aName = StringRegExp(..., ..., 3) с флагом 3 возвращает массив и результаты, если есть будут в $aName[0], $aName[1] и т.д.
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
да так-то оно работает, проблема в том,
что данные читаются из файла в массив,
а два раза одну строку не заменить.
и получить нужно 2 значения из одной строки в 2 разных поля ввода.


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

madmasles сказал(а):
damien2008
У меня так работает:
Код:
$sText = 'д;анныеданныед;анныеданныеданные:фамилия;имя'

$sSurname = StringRegExpReplace($sText, '(?s).*?:(.*?);.*', '\1')
$sName = StringRegExpReplace($sText, '(?s).*?:.*?;(.*?)$', '\1')
MsgBox(0, '', $sSurname & ' - ' & $sName)

$aName = StringRegExp(..., ..., 3) с флагом 3 возвращает массив и результаты, если есть будут в $aName[0], $aName[1] и т.д.

так я ж говорю, все флаги перепробовал, в основном либо 1 либо 0.
а в массиве одну и ту же строку 2 раза заменить невозможно.

и кроме 3 строки еще есть 1,2, ... , 4, 5, 6..и т.д. для них место зарезервировано.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
[?]
Цитата сказал(а):
так я ж говорю, все флаги перепробовал, в основном либо 1 либо 0.

функция StringRegExp с флагом 3 возвращает массив, а не строки вхождения регэксп
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
asdf8 сказал(а):
[?]
Цитата сказал(а):
так я ж говорю, все флаги перепробовал, в основном либо 1 либо 0.

функция StringRegExp с флагом 3 возвращает массив, а не строки вхождения регэксп

без флагов возвращает 0.
в The Regex Coach проверял, значения находит правильные, а в Autoit - нет.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
damien2008
Код:
#include <File.au3>
#include <Array.au3>

Dim $aText
Dim $aResult[1][2]
$j = 0
_FileReadToArray(@ScriptDir & '\test.txt', $aText)
For $i = 1 To $aText[0]
		$aSurname = StringRegExp($aText[$i], '(?s).*?:(.*?);.*', 3)
		$aName = StringRegExp($aText[$i], '(?s).*?:.*?;(.*?)$', 3)
		If IsArray($aSurname) And IsArray($aName) Then
		$j += 1
		ReDim $aResult[$j + 1][2]
		$aResult[$j][0] = $aSurname[0]
		$aResult[$j][1] = $aName[0]
	EndIf
Next
$aResult[0][0] = $j
_ArrayDisplay($aResult)
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Лучше всетаки почитать справку

Код:
Dim $ARRAY

Func _open()
	$var = FileOpenDialog($message, @ScriptDir & "\", "config (*.txt)", 1 + 4)
	If @error Then
		$ADDR = 0
	Else
		$ADDR = $var
		_FileReadToArray($ADDR, $ARRAY)

		$tmp = StringRegExp($ARRAY[3], ":(.*);(.*)$", 3)
		If Not @error Then
			GUICtrlSetData($Input1, $tmp[0])
			GUICtrlSetData($Input2, $tmp[1])
		EndIf

	EndIf
EndFunc


причем, в примере из первого поста зачем-то записываются выходные данные в массив входных данных, для этого лучше использовать отдельные переменные или массивы
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
asdf8

Код:
$tmp = StringRegExp($ARRAY[3], ":(.*);(.*)$", 3)
        If Not @error Then
            GUICtrlSetData($Input1, $tmp[0])
            GUICtrlSetData($Input2, $tmp[1])
        EndIf


классная штука! спасибо большое. спасибо.
)

asdf8 !!!!!
это даже ещё лучше чем требовалось!
регекспы тоже читать в массив, и возвращать значения!!
риспект asdf8. просто риспект.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <File.au3>

Dim $ARRAY, $message

_open()

Func _open()
	$var = FileOpenDialog($message, @ScriptDir, "config (*.txt)", 1 + 4)
	
	If @error Then
		$ADDR = 0
	Else
		$ADDR = $var
		_FileReadToArray($ADDR, $ARRAY)
		If @error Then Return
		
		$aData = StringRegExp($ARRAY[3], "^.*:(.*);(.*)$", 3) ;[0] = фамилия, [1] = имя
		
		$sFamily = $aData[0]
		$sName = $aData[1]
		
		ConsoleWrite($sFamily & @LF)
		ConsoleWrite($sName & @LF)
		
		;GUICtrlSetData($Input1, $sFamily)
		;GUICtrlSetData($Input2, $sName)
	EndIf
EndFunc


Я только не понимаю почему именно 3-я строка.
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
CreatoR сказал(а):
Я только не понимаю почему именно 3-я строка.

да просто нужно начинать читать файл с 3 строки))
CreatoR тоже хорошее решение.
 
Верх