Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Парсинг строк для ленивых / 16 сообщений из 16, страница 1 из 1
25.07.2018, 13:20
    #39678878
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
Есть ли в стандартной Tokyo нечто, что может такую строку
Код: pascal
1.
'CN=User,OU=SubDep\,OU\=1,OU=Dep,DC=Dom'


разложить на компоненты?

В идеале хочется увидеть такой массив
Код: pascal
1.
['CN', 'User', 'OU', 'SubDep,OU=1', 'OU', 'Dep', 'DC', 'Dom']



Проблема в экранирующем символе

String.Split умеет парсить закавыченные строки. А экранированные нет.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
25.07.2018, 13:22
    #39678881
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
_Vasilisk_Есть ли в стандартной Tokyo нечто, что может такую строку
Код: pascal
1.
'CN=User,OU=SubDep\,OU\=1,OU=Dep,DC=Dom'


разложить на компоненты?

В идеале хочется увидеть такой массив
Код: pascal
1.
['CN', 'User', 'OU', 'SubDep,OU=1', 'OU', 'Dep', 'DC', 'Dom']



Проблема в экранирующем символе

String.Split умеет парсить закавыченные строки. А экранированные нет.

С уважением, Vasilisk

По-моему, написать свой быстрее, чем ждать ответа
...
Рейтинг: 0 / 0
25.07.2018, 13:22
    #39678882
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
_Vasilisk_,

Заменить экранированные символы на что-то типа %$$$$%, потом распарсить Split`ом ? А после сплита вернуть взад замену.
...
Рейтинг: 0 / 0
25.07.2018, 13:33
    #39678893
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
DarkMasterЗаменитьДа вариантов куча. Если писать, тогда уже обычным циклом. Интересно было есть ли что-то стандартное?
...
Рейтинг: 0 / 0
25.07.2018, 13:45
    #39678903
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
_Vasilisk_DarkMasterЗаменитьДа вариантов куча. Если писать, тогда уже обычным циклом. Интересно было есть ли что-то стандартное?
Использовать нормальные компоненты/классы для работы с active directory.
...
Рейтинг: 0 / 0
25.07.2018, 13:50
    #39678909
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
JaDi нормальные компоненты/классы "нормальных" классов я там не увидел
...
Рейтинг: 0 / 0
25.07.2018, 14:29
    #39678938
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
_Vasilisk_В идеале хочется увидеть такой массив
['CN', 'User', 'OU', 'SubDep,OU=1', 'OU', 'Dep', 'DC', 'Dom']

Не совсем понятно по какому принципу строится массив. Но первое, что приходит в голову, это:
Код: pascal
1.
'CN=User,OU=SubDep\,OU\=1,OU=Dep,DC=Dom'.Split(['=', ',', '\']);


Будут лишние пустые элементы, но для настоящих программистов это же не страшно? :-)
...
Рейтинг: 0 / 0
25.07.2018, 14:35
    #39678946
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
DimonkaНе совсем понятно по какому принципу строится массивСтрока разбивается на подстроки ра разделителю ",", а потом каждая подстрока разбивается на "имя", "значение" по "=". При этом символ "\" является экранирующим
...
Рейтинг: 0 / 0
25.07.2018, 14:53
    #39678963
haydegen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
_Vasilisk_DimonkaНе совсем понятно по какому принципу строится массивСтрока разбивается на подстроки ра разделителю ",", а потом каждая подстрока разбивается на "имя", "значение" по "=". При этом символ "\" является экранирующим

может тогда обычный TStringList лучше использовать ?
...
Рейтинг: 0 / 0
25.07.2018, 14:59
    #39678975
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
haydegenTStringListУ него та же проблема, что и у String.Split. Он умеет работать с закавыченными строками, но не умеет с экранированными
...
Рейтинг: 0 / 0
25.07.2018, 15:06
    #39678988
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
Поддержки Escape символов, вроде бы, нет. Не паскалевская фича. Да и задача чересчур специфическая. Если нет особых требований по скорости, я бы посоветовал долгий путь заменами:
\\ => \slash\
\, => \comma\
\= => \eq\
...
split по ","
подстановки все заменить на символы для каждого элемента.

Либо, чуть быстрее и короче:
\\ => \slash\
\, => \comma\
\= => \eq\
...
, => #0 (точно не встретится в корректной исходной строке)
подстановки заменить на символы
split по #0
...
Рейтинг: 0 / 0
25.07.2018, 16:05
    #39679069
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
Ладно.. оптимизируйте:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
var
  s: string;
  i: Integer;
  CurChar, PrevChar: Char;
  k: Integer;
  res: TStringList;
begin
  res := TStringList.Create;
  s := 'CN=User,OU=SubDep\,OU\=1,OU=Dep,DC=Dom';
  k := 1;
  PrevChar := #0;
  for i := 1 to Length(s) do
  begin
    CurChar := s[i];
    if (CurChar in [',', '=']) and (PrevChar <> '\') and
      ((i - 1) > k) then
    begin
      res.add(StringReplace(copy(s, k, i - k), '\', '', [rfReplaceAll]));
      k := i + 1;
    end;
    PrevChar := CurChar;
  end;
...
Рейтинг: 0 / 0
25.07.2018, 16:13
    #39679082
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
У меня свой метод "для ленивых".

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Function CutSubParam(var Text: String; Delimeter: String = ';'): String;
var
  p : integer;
begin
  p:=pos(Delimeter,Text);
  if p=0 then begin
    Result:=Text;
    Text:='';
  end else begin
    Result:=copy(Text,1,p-1);
    Text:=copy(Text,p+length(Delimeter),length(Text));
  end;
end;



А потом
Код: pascal
1.
2.
3.
4.
  Line:='CN=User,OU=SubDep\,OU\=1,OU=Dep,DC=Dom';
  CN:=CutSubParam(Line,'=');
  User:=CutSubParam(Line,',');
  //и т.д.
...
Рейтинг: 0 / 0
25.07.2018, 16:58
    #39679130
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
rgreatУ меня свой метод "для ленивых".
который обломается на первом эскейпнутом символе
...
Рейтинг: 0 / 0
25.07.2018, 17:12
    #39679154
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
Василий 2,

Он не для этого сделан.
...
Рейтинг: 0 / 0
26.07.2018, 14:28
    #39679641
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строк для ленивых
rgreatУ меня свой метод "для ленивых".Да свой и я вчера написал
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Парсинг строк для ленивых / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]