PDA

Просмотр полной версии : парими значения


akimov_aleks
12.06.2010, 15:13
Возник вопрос.
я хочу с парсить значения с исходного кода.
'idi': '784167',
если использовать так
idi':=Copy(S, Pos('idi'', V)+7, 6);
то касяк так как 784167 может состоять как из 6 так из 5 или 7 цифр
попробовал через функцию
idi':=(Pars('от',S,'до'));
от это - 'idi': '
до это- ',
так нельзя подставить граници от до так как они содержат знак '
сама функция

function Pars(T_, ForS, _T: string): string;
var
a, b: integer;
begin
Result := '';
if (T_ = '') or (ForS = '') or (_T = '') then
Exit;
a := Pos(T_, ForS);
if a = 0 then
Exit
else
a := a + Length(T_);
ForS := Copy(ForS, a, Length(ForS) - a + 1);
b := Pos(_T, ForS);
if b > 0 then
Result := Copy(ForS, 1, b - 1);
end;

какие еще есть методы подскажите.

GhostOnline
12.06.2010, 16:08
procedure TForm2.Button3Click(Sender: TObject);
var
s : string;
result : string;
i : Byte;
begin
s := '''idi'': ''7841671'',';
s := Copy(S, Pos('idi''', S)+7);
for I := 1 to Length(s) do
if (Ord(s[i]) >= 48) and (Ord(s[i]) <= 57) then
result := result + s[i]
else
Break;
ShowMessage(result);
end;

...

ErrorNeo
12.06.2010, 16:15
idi:=Copy(S, Pos('idi'', V)+7, 7);
if not (idi[5] in ['0'..'9']) then setlength(idi,5) else
if not (idi[6] in ['0'..'9']) then setlength(idi,6);

Ra$cal
12.06.2010, 16:22
регэкспы?

GhostOnline
12.06.2010, 16:25
ErrorNeo кстати да, можно же на вхождение в множество проверять.
Я сначал объявлял переменную set of '0'..'9' так там оказывалось не то что я ожидал.
Но твой способ вроде катит только на 5-6 цифр, остальное надо дописывать.
Допустим если 10 цифр будет?
Переделанный код с множествами

s := Copy(S, Pos('idi''', S)+7);
for I := 1 to Length(s) do
if s[i] in ['0'..'9'] then
result := result + s[i]
else
Break;
ShowMessage(result);

ErrorNeo
12.06.2010, 16:26
а я в своих программах не допускаю невозможных случаев=)
если ТС сказал 5-7 символов, значит 5-7 символов! xD

Ra$cal
12.06.2010, 17:24
'(?<id>[\w]+)'\s*:\s*'(?<number>[\d]+)'

Вот и все. Что вы там очередные велосипеды придумываете?

Если лимиты есть можно точнее ограничить
'(?<id>[\w]+)'\s*:\s*'(?<number>[\d]{5,7})'

M_script_
12.06.2010, 18:03
sText.Delete(1, sText.Pos("'idi':") + 6 - 1);
sText.Delete(1, sText.Pos("'"));
sText.SetLength(sText.Pos("'") - 1);