![]() |
|
|
#1
|
|||
|
|||
|
Добрый день!
Имеется строка: s2:='CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович'; необходимо разобрать строку по параметрам..Например: CN:='Иванов Иван Иванович'; Adress:= подстроке с параметром STREET как это сделать? вот пример моего кода: Код:
try
sl:=TStringList.Create;
SplitText(s2, sL);
for i := 0 to sl.Count - 1 do begin
if pos('OID.2.5.4.12=',sl[i])<>0 then begin
doljn:=sl[i];
n:=length(doljn);
doljn:=copy(doljn,16,n);
end;
if pos('OID.2.5.4.4=',sl[i])<>0 then begin
familia:=sl[i];
n:=length(familia);
familia:=copy(familia,14,n);
end;
if pos('OID.2.5.4.41=',sl[i])<>0 then begin
imia_otchestvo:=sl[i];
n:=length(imia_otchestvo);
imia_otchestvo:=copy(imia_otchestvo,15,n);;
end;
end;
showmessage(Должность: '+doljn);
showmessage('ФИО: '+familia+' '+imia_otchestvo);
finally
sL.Free;
end;Но тогда засада с адресом..как быть? Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 10:52. |
|
#2
|
||||
|
||||
|
Если количество параметров всегда одно и тоже, то можно просто циклом искать всё между очередной "=" и знаком "," записывая в массив
Код:
var
params = array[0..9] of string;
while not pos("=",str) <> 0 do
begin
p1 := pos('=',str);
params[i] := copy(str, p1, pos(','str) - p1);
i:=i+1;
end;Школьное решение. А вообще надо присуммонить M.A.D.M.A.N'a с его плакатом "Используй RegExp!" Последний раз редактировалось Uniq!, 16.04.2014 в 18:21. |
|
#3
|
|||
|
|||
|
Цитата:
а если количество параметров меняется?! |
|
#4
|
||||
|
||||
|
Ну тогда я думаю стоит воспользоваться вторым советом:
Цитата:
|
|
#5
|
||||
|
||||
|
ИСПОЛЬЗУЙ REGEXP!
Последний раз редактировалось Admin, 17.04.2014 в 19:48. |
|
#6
|
||||
|
||||
|
Цитата:
'CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск\, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович' |
|
#7
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s2: string;
sl, sm: TStrings;
i: integer;
flg: boolean;
begin
s2:= 'CN=Иванов Иван Иванович,' +
' OU=Моя компания, O=экземпляр,' +
'STREET=г.Минск, ул.Ленина д.15 кв.45,' +
' L=test, ST=BPS, C=BY, OID.2.5.4.12=программист,' +
' OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович';
flg:= true;
sl:= TStringList.Create;
sm:= TStringList.Create;
sl.Delimiter:= ',';
sl.DelimitedText:= s2;
for i := 0 to sl.Count-1 do
if (Pos('=', sl[i]) > 0) then
begin
if flg then
begin
s2:= sl[i] + ' ';
flg:= false;
end else
begin
sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));
s2:= sl[i] + ' ';
end;
end else s2:= s2 + sl[i] + ' ';
sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));
Memo1.Lines.Assign(sm);
sl.Free;
sm.Free;
end;Последний раз редактировалось Alegun, 17.04.2014 в 08:48. Причина: исправление |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Eugene287 (17.04.2014)
| ||
|
#8
|
|||
|
|||
|
Цитата:
нет..это строка из буфера,в котором записаны данные о сертификате эл.ключа для подписи документов. спасибо большое!получилось! вопрос закрыт! Цитата:
хорошо..в Memo1 пишет все данные..а как сделать,чтобы каждый параметр записывался в свою переменную?! что-то не понимаю как это сделать.. Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 10:52. |
|
#9
|
||||
|
||||
|
Да они и так по-полочкам разложены, удобно со значениями в стринглист работать, но если очень хочется чтоб в отдельных переменных были строки, то пжлст, вот
Для начала Код:
var CN, OU, O, STREET, L, ST, C, OID_2_5_4_12, OID_2_5_4_4, OID_2_5_4_41: string; ... Код:
{ Вариант I, на доверии }
// Вставить до sm.Free
CN:= sm[0];
OU:= sm[1];
O:= sm[2];
STREET:= sm[3];
L:= sm[4];
ST:= sm[5];
C:= sm[6];
OID_2_5_4_12:= sm[7];
OID_2_5_4_4:= sm[8];
OID_2_5_4_41:= sm[9];
Код:
{ Вариант II, с проверкой наличия нужной строки}
{в процедуре необходимо сделать это
...
sm.Add(s2); // sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));
...
в двух местах}
for i := 0 to sm.Count-1 do
begin
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'CN' then
CN:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OU' then
OU:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'O' then
O:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'STREET' then
STREET:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'L' then
L:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'ST' then
ST:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'C' then
C:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.12' then
OID_2_5_4_12:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.4' then
OID_2_5_4_4:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.41' then
OID_2_5_4_41:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
end;![]() |