Что нового

Если элемента массива нет, то как задать его равным "ничему"

Suppir

Продвинутый
Сообщения
967
Репутация
62
Для строки:

Код:
for $i = 0 to UBound($Search) - 1
$Text = StringRegExpReplace($Text, $Search[$i][0], $Search[$i][1])
Next


$Search[$i][0] и $Search[$i][1] я получаю из файла. Столкнулся с тем, что если $Search[$i][1] вообще нет (пустота), то замены не происходит. Как сделать так, чтобы если $Search[$i][1] нет, то вместо него в выражение поставлялись две кавычки?
Код:
$Text = StringRegExpReplace($Text, $Search[$i][0], "")
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Re: Если элемента массива нет, то как задать его равным \"ничему\"

Suppir [?]
Как сделать так, чтобы если $Search[$i][1] нет, то вместо него в выражение поставлялись две кавычки?
Код:
...
If $Search[$i][1] = "" Then $Search[$i][1] = '""'
$Text = StringRegExpReplace($Text, $Search[$i][0], $Search[$i][1])
...


:smile:


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

Если под "кавычками" имеется в виду пустое (нулевое) значение, то по логике ничего не нужно делать, замена и так будет сделана на пустое значение :wacko:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Если элемента массива нет, то как задать его равным \"ничему\"

CreatoR, таким образом печатает огромное количество скобок.

По идее, если переменной нет, то должен менять на "ничего", т.е. вырезать найденное. Но здесь все иначе - если переменной нет, то функция не работает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Suppir [?]
таким образом печатает огромное количество скобок
Не скобок а кавычек, как ты и просил :D

если переменной нет, то должен менять на "ничего"
Что значит нет, это массив, и цикл начнётся только если Ubound($Search)-1 больше чем 0. А раз цикл начался, значит массив содержит такое количество элементов. Может проще привести полный пример, где происходит считывание файла, и далее где используется $Text, и что должно быть изменено в нём.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Если элемента массива нет, то как задать его равным \\\"ничему\\\"

Код программы:

Код:
TraySetState ( 1 )
Opt("TrayMenuMode", 1)

HotKeySet("^x", "_Replace")
HotKeySet("^ч", "_Replace")
HotKeySet("^+x", "_Exit")
HotKeySet("^+ч", "_Exit")

Global $Records
Global $Search[1000][2]
Global $Matches
Global $i, $IN

$IniFile = @ScriptDir & "\" & "замена в буфере.ini"

$Edit = TrayCreateItem("Редактировать список замен")
$Exit = TrayCreateItem("Выход")

if not FileExists($IniFile) Then
	TrayTip ("AutoIt", "Не могу найти файл ""замена в буфере.ini""", 1)
	sleep(2000)
	TrayTip("clears any tray tip","",0)
	Exit
EndIf	

TrayTip ("AutoIt", "Скрипт запущен", 1)
sleep(2000)
TrayTip("clears any tray tip","",0)

While 1 
    Switch TrayGetMsg()
    Case $Edit
        ShellExecute ($IniFile)
        TrayItemSetState ( $Edit, 4 )
    Case $Exit
        TrayItemSetState ( $Edit, 4 )
        _Exit()
    EndSwitch
WEnd

Func _Replace()
	
	if ClipGet() = "" Then 
		TrayTip ("AutoIt", "Буфер пустой!", 1)
		sleep(1000)
		TrayTip("clears any tray tip","",0)
		
	Else
		$in = FileOpen("замена в буфере.ini", 0)
		while 1
			local $i
			$line = FileReadLine($in)
			If @error = -1 Then ExitLoop
			
			$Matches = StringRegExp($line, "^Найти:(.+)", 1)	
			If @error = 0 Then
				$Search[$i][0] = $Matches[0] 
				ContinueLoop
			EndIf	
		
			$Matches = StringRegExp($line, "^Заменить на:(.+)", 1)
			If @error = 0 Then
				$Search[$i][1] = $Matches[0] 
				$i += 1
				ContinueLoop
			EndIf
		wend	

		Local $i
		TrayTip ("AutoIt", "Произвожу замену...", 1)
		
		$Text = ClipGet()

		for $i = 0 to UBound($Search) - 1
;~ 			В этом месте, если $Search[$i][1] нет, то замены на "ничего" не происходит
			$Text = StringRegExpReplace($Text, $Search[$i][0], $Search[$i][1])
		Next
		ClipPut($Text)
		TrayTip ("AutoIt", "Замена произведена", 1)
		sleep(1000)
		TrayTip("clears any tray tip","",0)
	EndIf
	
EndFunc


Func _Exit()
	
	TrayTip ("AutoIt", "Завершение работы скрипта", 1)
	Sleep(1000)
	Exit
	
EndFunc



Так выглядит ini-файл откуда читается массив $Search:
--------------------------------------------------------
Найти:^ +
Заменить на:
--------------------------------------------------------

Найти:^ + - это $Search[$i][0]. Рег. выражение должно найти пробелы в начале строки
Заменить на: - это $Search[$i][1]. Т.к. после двоеточия ничего нет, то $Search[$i][1] равен ничему (массив-то мы проинициализировали ранее). В общем, должна произвестись замена на "ничего", но замены не происходит.


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

Например, в Perl замена происходит с помощью оператора s///:

s/найти/заменить на/;

Если написать s/^ +/$var1/
и этой $var1 нету, то будет выражение равно s/^ +//, т.е. найденное просто удалится.
В AutoIt, если $var1 нет, то нужно место нее прописать StringRegExpReplace($Text, $Search[$i][0], "") (т.е. две скобки).
Но если сделать так, как предложил Creator, то AutoIt понимает строку как:
StringRegExpReplace($Text, $Search[$i][0], """") - т.е. он эти две скобки берет еще в две скобки, и вместо замены на "ничего" начинает печатать кучу скобок


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

Я пробовал так:

Код:
for $i = 0 to UBound($Search) - 1
if $Search[$i][1]="" then
StringRegExpReplace($Text, $Search[$i][0], "")
Else 
$Text = StringRegExpReplace($Text, $Search[$i][0], $Search[$i][1])
EndIf
еще пробовал смотреть длину $Search[$i][1] - если нулевая, то использовать строку StringRegExpReplace($Text, $Search[$i][0], "")

но так все равно не выходит
 
Верх