Страница 1 из 1
как быстро распарсить строку
Добавлено: 06.06.2012 12:25:13
Brainenjii
есть строка '"index":"some \"value\""' мне нужно по запросу 'index' получить 'some "value"'. Сейчас реализовано так:
Код: Выделить всё
Function GetJSStr(Const aSource, aIndex: String): String;
Var
aPos: Integer;
Begin
aPos := Pos('"' + aIndex + '":"', aSource);
If aPos = 0 Then Exit('');
aPos := aPos + Length('"' + aIndex + '":"');
Result := Copy(aSource, aPos, PosEx('"',aSource, aPos) - aPos);
end;
но экранированные кавычки такой "парсер", разумеется, не возьмёт...
Re: как быстро распарсить строку
Добавлено: 06.06.2012 12:36:36
Mr.Smart
У меня так реализовано:
Код: Выделить всё
function CStrToStr(const S: String): String;
var
j: Integer;
esc: Boolean;
b: Integer;
begin
Result:='';
j:=1;
esc:=False;
while j<=Length(S) do
begin
if esc then
begin
case S[j] of
'A','a': Result:=Result+#7;
'B','b': Result:=Result+#8;
'T','t': Result:=Result+#9;
'R','r': Result:=Result+#10;
'V','v': Result:=Result+#11;
'F','f': Result:=Result+#12;
'N','n': Result:=Result+#13;
'Q','q','"': Result:=Result+'"';
'P','p','''': Result:=Result+'''';
'0':
begin
if ((Length(S)-j)>2) and ((S[j+1]='x') or (S[j+1]='X')) then
begin
if TryStrToInt(Copy(S,j,4),b) then
Result:=Result+chr(Byte(b));
inc(j,3);
end
else
Result:=Result+#0;
end;
// '': Result:=Result+'';
else Result:=Result+S[j];
end;
esc:=False;
end
else if S[j]='' then
esc:=True
else
Result:=Result+S[j];
inc(j);
end;
if esc then
Result:=Result+'';
end;
Добавлено спустя 4 минуты 14 секунд:Не ту функцию кинул. Декводирование строк с учётом эскэйп последовательности
Код: Выделить всё
function StrQuoteBetween(var Str: String; out OStr: String; const Quote: Char = '"';
const Esc: Char = '\'): Boolean;
var
j,b: Integer;
e: Boolean = False;
begin
OStr:='';
Result:=False;
if (Length(Str)<2) and (Str[1]<>Quote) then
Exit;
j:=2;
while j<=Length(Str) do
begin
if e then
begin
case Str[j] of
'A','a': OStr:=OStr+#7;
'B','b': OStr:=OStr+#8;
'T','t': OStr:=OStr+#9;
'R','r': OStr:=OStr+#10;
'V','v': OStr:=OStr+#11;
'F','f': OStr:=OStr+#12;
'N','n': OStr:=OStr+#13;
'Q','q','"': OStr:=OStr+'"';
'P','p','''': OStr:=OStr+'''';
'0':
begin
if ((Length(Str)-j)>2) and ((Str[j+1]='x') or (Str[j+1]='X')) then
begin
if TryStrToInt(Copy(Str,j,4),b) then
OStr:=OStr+chr(Byte(b));
inc(j,3);
end
else
OStr:=OStr+#0;
end;
else OStr:=OStr+Str[j];
end;
e:=False;
end
else if Str[j]=Esc then
e:=True
else if Str[j]=Quote then
begin
Result:=True;
Break;
end
else
OStr:=OStr+Str[j];
inc(j);
end;
Delete(Str,1,j);
end;
Re: как быстро распарсить строку
Добавлено: 06.06.2012 12:42:23
Brainenjii
циклом - это конечно вариант... Но вдруг есть какой-то волшебный метод, именно для экранируемых сиволов? ^_^ Штука-то часто встречающаяся...
Re: как быстро распарсить строку
Добавлено: 06.06.2012 12:44:18
Mr.Smart
Там в любом случае цикл будет.
Re: как быстро распарсить строку
Добавлено: 06.06.2012 13:41:18
Ism
Веселые чуваки
ExtractWord
http://www.freepascal.org/docs-html/rtl ... tword.htmlИх комбинацией можно все сделать
Re: как быстро распарсить строку
Добавлено: 06.06.2012 13:59:33
Brainenjii
Обычным циклом можно гораздо оптимальней сделать ^_^
Спасибо за предложения