Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.06.2017, 13:16
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию Помощь в регулярных выражениях

Добрый день, есть строка S:string в которой есть:
Код:
User.MoveTo(54754,35674,-1217); User.MoveTo(9764,1258,573); User.MoveTo(9836,52964,1649);
Как мне вытащить из строки координаты с помощью регуляных выражений и записать в массив?
Должно получиться что-то типа:
x[0]=54754;
y[0]=35674;
z[0]=-1217;

x[1]=9764;
y[1]=1258;
z[1]=573;

x[2]=9836;
y[2]=52964;
z[2]=1649;

Последний раз редактировалось kenshi245, 08.06.2017 в 14:18.
Ответить с цитированием
  #2  
Старый 08.06.2017, 15:07
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно вытащить и без регулярок
Код:
var
 x,y,z: array[0..2] of integer;
 s: string = 'User.MoveTo(54754,35674,-1217); User.MoveTo(9764,1258,573); User.MoveTo(9836,52964,1649);';

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 rs: string;
begin
 s:= StringReplace(s,');',',',[rfReplaceAll]);
 rs:= '';
 for i := 1 to Length(s) do
  if s[i] in ['0'..'9','-',','] then rs:= rs + s[i];

 for i := 0 to 2 do
  begin
   x[i]:= StrToInt(Copy(rs,1, Pos(',',rs)-1));
   Delete(rs,1,Pos(',',rs));
   y[i]:= StrToInt(Copy(rs,1, Pos(',',rs)-1));
   Delete(rs,1,Pos(',',rs));
   z[i]:= StrToInt(Copy(rs,1, Pos(',',rs)-1));
   Delete(rs,1,Pos(',',rs));
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
kenshi245 (08.06.2017)
  #3  
Старый 08.06.2017, 17:06
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию

Цитата:
Сообщение от Alegun
Можно вытащить и без регулярок
Код:
var
 x,y,z: array[0..2] of integer;
 s: string = 'User.MoveTo(54754,35674,-1217); User.MoveTo(9764,1258,573); User.MoveTo(9836,52964,1649);';

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 rs: string;
begin
 s:= StringReplace(s,');',',',[rfReplaceAll]);
 rs:= '';
 for i := 1 to Length(s) do
  if s[i] in ['0'..'9','-',','] then rs:= rs + s[i];

 for i := 0 to 2 do
  begin
   x[i]:= StrToInt(Copy(rs,1, Pos(',',rs)-1));
   Delete(rs,1,Pos(',',rs));
   y[i]:= StrToInt(Copy(rs,1, Pos(',',rs)-1));
   Delete(rs,1,Pos(',',rs));
   z[i]:= StrToInt(Copy(rs,1, Pos(',',rs)-1));
   Delete(rs,1,Pos(',',rs));
  end;
end;

Есть одна проблемка, если будет строка 'User.MoveTo(54754,35674,-1217); User.TROLOLOLO(9764,1258,573); User.MoveTo(9836,52964,1649);';
То он не должен записывать второе значение, так как там нет User.MoveTo, а ваш скрипт это делает)
Ответить с цитированием
  #4  
Старый 08.06.2017, 17:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

В первом посте про "User.TROLOLOLO" ни слова здесь предложен не по тегам разбор, а по цифрам, тогда предварительно следует убрать всё лишнее, а где и как, вам лучше видно
Ответить с цитированием
  #5  
Старый 08.06.2017, 18:25
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию

Цитата:
Сообщение от Alegun
В первом посте про "User.TROLOLOLO" ни слова здесь предложен не по тегам разбор, а по цифрам, тогда предварительно следует убрать всё лишнее, а где и как, вам лучше видно

А как можно получить содержимое между User.MoveTo( и );
Ответить с цитированием
  #6  
Старый 08.06.2017, 18:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Разбить на группы:
User\.MoveTo\([-\d]*,[-\d]*,[-\d]*\);

Внутри группы разбить на цифры:
([-\d]+)
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
kenshi245 (09.06.2017)
  #7  
Старый 09.06.2017, 00:28
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию

Цитата:
Сообщение от lmikle
Разбить на группы:
User\.MoveTo\([-\d]*,[-\d]*,[-\d]*\);

Внутри группы разбить на цифры:
([-\d]+)

В общем попробовал такое рег. выр.
Код:
RegExp.Expression := 'User.MoveTo\(([-]?[0-9]+?),([-]?[0-9]+?),([-]?[0-9]+?)\)\;';
Но проблема в том, что маркер /.../i не работает, и если написать user.moveto, то ничего не находит.

Вот так не работает:
Код:
RegExp.Expression := '/User.MoveTo\(([-]?[0-9]+?),([-]?[0-9]+?),([-]?[0-9]+?)\)\;/i';
Ответить с цитированием
  #8  
Старый 09.06.2017, 00:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

все работает. Там просто при создании объекта надо roIgnoreCase передать в параметре Options вместо указания /i в самом выражении.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
kenshi245 (09.06.2017)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter