tag:blogger.com,1999:blog-3208941668630248550.post1169205176253001730..comments2024-03-13T10:43:06.615+02:00Comments on 18-ть лет с Delphi: Кто-то ещё использует "парсинг" из RX?Alex W. Lulinhttp://www.blogger.com/profile/08400475846894229767noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-3208941668630248550.post-7345929378538350372018-01-28T19:20:54.389+02:002018-01-28T19:20:54.389+02:00Я даже не знаю, куда тут лямбды прислонить, но у м...Я даже не знаю, куда тут лямбды прислонить, но у меня есть такой вот алгоритм, для Lazarus, технически, наверное, в Delphi тоже должен заработать (возможно, с минимальными правками):<br /><br />unit ...;<br /><br />interface<br /><br />type<br /> TCharSet=set of char;<br /><br />Const<br /> DefaultWhiteList:TCharSet=['A'..'Z','a'..'z','0'..'9',<br /> // АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЫЭЮЯабвгдеёжзийклмнопрстуфхцчшщъьыэюя<br /> // this is parts of UTF-8 pairs in russian characters presentation<br /> #$80..#$BF,#$D0,#$D1];<br /><br />type<br /><br /> { TWordEnumerator }<br /><br /> TWordEnumerator=class<br /> private<br /> fPredIndex,fCurIndex,fLen:integer;<br /> fData:string;<br /> fWhiteList:set of char;<br /> function GetWord:string;{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}<br /> public<br /> property Current:string read GetWord;<br /> function MoveNext:boolean;<br /> function GetEnumerator:TWordEnumerator;{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}<br /> Constructor Create(const Input:string;const WhiteList:TCharSet=[]);<br /> end;<br /><br />// allow to traverse UTF-8 words in string<br />// example:<br />// var C:string;<br />// For C in WordList('Привет мой безумный мир! Hello my mindless world!') do...<br />// works only for latin and russian characters by default, for other alphabets,<br />// WhiteList parameter should be filled with appropriate characters (NOT UTF-8 pairs!) <br />function WordList(const Input:string;const WhiteList:TCharSet=[]):TWordEnumerator;<br /><br />implementation<br /><br />{ TWordEnumerator }<br /><br />function TWordEnumerator.GetWord: string;<br />begin<br /> Result:=Copy(fData,fPredIndex,fCurIndex-fPredIndex);<br />end;<br /><br />function TWordEnumerator.MoveNext: boolean;<br />begin<br /> fPredIndex:=fCurIndex;<br /> // skip first non-word characters<br /> while (fPredIndex<=fLen) and (not (fData[fPredIndex] in fWhiteList)) do<br /> Inc(fPredIndex);<br /> // check, that something remains in string<br /> Result:=fPredIndex<=fLen;<br /> if not Result then exit;<br /> // find end of word<br /> fCurIndex:=fPredIndex;<br /> while (fCurIndex<=fLen) and (fData[fCurIndex] in fWhiteList) do<br /> Inc(fCurIndex);<br />end;<br /><br />function TWordEnumerator.GetEnumerator: TWordEnumerator;<br />begin<br /> Result:=Self;<br />end;<br /><br />constructor TWordEnumerator.Create(const Input:string;const WhiteList:TCharSet);<br />begin<br /> inherited Create;<br /> fPredIndex:=1;<br /> fCurIndex:=1;<br /> fData:=Input;<br /> fLen:=Length(Input);<br /> if WhiteList=[] then<br /> fWhiteList:=DefaultWhiteList<br /> else<br /> fWhiteList:=WhiteList;<br />end;<br /><br />function WordList(const Input:string;const WhiteList:TCharSet=[]):TWordEnumerator;<br />begin<br /> Result:=TWordEnumerator.Create(Input,WhiteList);<br />end;<br /><br />end.<br /><br />На большинстве случаев работает, этот код разрабатывался для студента, которому надо было узнать максимальную длину слова в строке... точно знаю, что чувак не сдал, ибо итераторы они ещё не проходили, но я алгоритм сохранил.Anonymousnoreply@blogger.com