Matlab,正则表达式,加载坐标

时间:2017-11-10 08:53:15

标签: regex matlab

假设以下文件包含封闭区域的多边形表示:

1.0   3.5
0.9   -1.4
-4.9  -17.9
0.1   9.6

-9.7   13.3
8.9   11.2
-6.4  0.1
10.3  2.2

每个区域由块除以空行表示。我想使用正则表达式将每个块加载到矩阵/数组。但是,以下代码

 file= fileread( 'test.txt' ) ;
 bs= regexp( file, '[\n\r]+(*)', 'tokens' ) ;
 bs= [bs{:}] ;

提供空bs

 bs: empty 0 x 0, double

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

我就是这样做的:

bs = cellfun(@str2num, regexp(file,'(\r?\n){2}','split'), 'UniformOutput', false);

因此,您基本上会因出现两个换行符(Linux)或两个返回换行符(Windows)而拆分。每个结果字符串都转换为带有str2num的矩阵。

警告在此处按顺序排列:str2num在内部调用eval,因此可能会运行潜在的dangeours代码。例如,该文件可以包含! rm *,并且将执行该文件。为避免这种情况,您可以检查文件是否只包含数字,空格字符,小数点和加号/减号:

valid = all(ismember(file, ['0':'9' 1:32 '.+-']));

并仅在validtrue的情况下继续。

代码给出了一个矩阵的单元阵列,每个块都在一个单元格中。对于您的示例文件,

>> celldisp(bs)
bs{1} =
   1.000000000000000   3.500000000000000
   0.900000000000000  -1.400000000000000
  -4.900000000000000 -17.899999999999999
   0.100000000000000   9.600000000000000
bs{2} =
  -9.699999999999999  13.300000000000001
   8.900000000000000  11.199999999999999
  -6.400000000000000   0.100000000000000
  10.300000000000001   2.200000000000000

答案 1 :(得分:2)

首先将文本拆分为提及的"块"。

可能更好
data = strsplit(fileread('test.txt'), '\n\n');

areas = regexp(data, '(-?\d+\.\d+)[ ]+(-?\d+\.\d+)', 'tokens');

这将导致一个细胞细胞,每个细胞包含两个数字的细胞作为字符串。

{ { {'1.0', '3.5'} ,
    {'0.9', '-1.4'} ,
     ...            } ,
   { ... } }

所以我们需要将第二阶段单元格转换为数字数组,以便将它们作为矩阵使用。

areas = cellfun(@str2double, areas, 'UniformOutput', false);

......顺便说一下,你在搜索模式中对(*)的意图是什么?