Что нового

Поиск символа в строке делением последней пополам

SET777

Новичок
Сообщения
51
Репутация
3
Здравствуйте!
Как можно написать скрипт который бы делил неопределенный набор символов на 2 части, искал символ в первой половине, далее, делил оставшуюся, вторую половину на 2 и так же искал в первой половине второго деления... И так до конца всего набора символов. Ну или можно просто выводить символы в которых будет осуществляться поиск - сообщением.
Заранее спасибо.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$sLine = 'some text, which can be really long'
$cSearch = 'e'
_Search($sLine, $cSearch)

Func _Search($sLine, $cSearch)
    $nChars = StringLen($sLine)
    $nMid = Int($nChars/2)
    $sFirst = StringMid($sLine, 1, $nMid)
    $sLast = StringRight($sLine, $nChars - $nMid)
    If Not $nMid Then
        ConsoleWrite('"' & $sLast & '" - ' & StringInStr($sLast, $cSearch) & @CRLF & 'The end' & @CRLF)
        Return
    EndIf
    ConsoleWrite('"' & $sFirst & '" - ' & StringInStr($sFirst, $cSearch) & @CRLF);' "' & $sLast & '"' & @CRLF)
    _Search($sLast, $cSearch)
EndFunc
 
Автор
S

SET777

Новичок
Сообщения
51
Репутация
3
Спасибо большое за пример! ;) По поводу смысла в делении - мне интересно понять сам процесс и реализацию такого поиска. А можно ли выполнить этот поиск в цикле For Next, что бы поиск осуществлялся в возвращаемом значении функции StringMid?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
SET777 [?]
А можно ли выполнить этот поиск в цикле For Next,
в принципе можно, но зачем?
как говорил Питер Дойч – "Итерация от человека. Рекурсия — от Бога".
 
Автор
S

SET777

Новичок
Сообщения
51
Репутация
3
Мне интересно как это можно реализовать в цикле. Можно просто символы сообщением вывести, те, которые в Вашем примере с консолью. :smile:
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Зачем изобретать велосипед, когда уже создан супер навороченный складной ножик StringRegExp? :thumbs_up: Мало скорости при обработке огромных массивов? Дык есть SQL... :whistle:
 
Автор
S

SET777

Новичок
Сообщения
51
Репутация
3
До StringRegExp пока не добрался, я новичок в программировании (Autoit - первый ЯП). Поэтому хотелось бы сначала "велик" изобрести :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
SET777,
Так достаточно быстро находит все вхождения в текст (файл test.txt в прикрепленном архиве):
Код:
#include <Array.au3>

$sString = FileRead(@ScriptDir & '\test.txt')

$sSearch = 'Андрей'
$iStart = TimerInit()
$iLen = StringLen($sString)
Dim $aNum[$iLen] = [0]
$j = 0
$iSearch = 0
For $i = 1 To $iLen
	$iSearch = StringInStr($sString, $sSearch, 1, $i)
	If $iSearch Then
		$j += 1
		$aNum[$j] = $iSearch
	Else
		ExitLoop
	EndIf
Next
ReDim $aNum[$j + 1]
$aNum[0] = $j
$sTime = StringFormat('time: %.3f sec', TimerDiff($iStart) / 1000)
;$aNum[0] - кол-во найденных вхождений
;$aNum[1] и далее до конца массива - позиция вхождения
_ArrayDisplay($aNum, $sTime)
 
Верх