Вот решение, которое полностью исключает использование eval
.Это не так элегантно, как один лайнер, но не подвергает вас риску eval
.Если кто-то попытается внедрить вредоносный код во входную строку, худшее, что он сделает, - это ошибка, а не выполнение мошеннического кода.
В вашем примере в конце есть только одна инструкция colon assignment
.Я сделал свое решение более общим, предполагая, что эти инструкции могут быть множественными и размещаться случайным образом.Так, например, я рассмотрел следующую входную строку:
a = {'1 25 27 45 46 62 65 70 73 76 77:83 99 101:105'}
Исходя из этого, запустите следующее:
%%
fullArray = strsplit(a{1},' ') ; % split the string into a cell array
scalarArray = str2double(fullArray) ; % convert all simple scalar values
idxNotScalar = find(isnan(scalarArray)) ; % find cells with "colon" operator
% split the arrays
colonArray = fullArray(idxNotScalar) ; % place colon instruction in a separate array
scalarArray(idxNotScalar) = [] ; % clear them from the scalarArray
%% Now parse the colon instructions cells
nElem = numel(colonArray) ;
ctmp = cell(nElem,1) ;
for k=1:nElem
c = textscan( colonArray{k} , '%d:%d' ) ;
ctmp{k,1} = double( c{1}:c{2} ) ;
end
%% now concatenate all results and sort
my_array = sort(cat(2,scalarArray,ctmp{:})) ;
Чтобы получить:
my_array =
1 25 27 45 46 62 65 70 73 76 77 78 79 80 81 82 83 99 101 102 103 104 105