Regex Matlab,正则表达式,负载坐标

Regex Matlab,正则表达式,负载坐标,regex,matlab,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{:}] ;

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

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

感谢您的帮助。

最好先将文本拆分为所提到的“块”

这将导致一个单元格,每个单元格包含两个数字作为字符串的单元格

{ { {'1.0', '3.5'} ,
    {'0.9', '-1.4'} ,
     ...            } ,
   { ... } }
因此,我们需要将第二阶段的单元转换为数值数组,以便将它们作为矩阵使用

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

。。。顺便问一下,您在搜索模式中对
(*)
的意图是什么?

最好先将文本拆分为所提到的“块”

这将导致一个单元格,每个单元格包含两个数字作为字符串的单元格

{ { {'1.0', '3.5'} ,
    {'0.9', '-1.4'} ,
     ...            } ,
   { ... } }
因此,我们需要将第二阶段的单元转换为数值数组,以便将它们作为矩阵使用

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

。。。顺便问一下,您在搜索模式中对
(*)
有什么打算?

我会这样做:

bs = cellfun(@str2num, regexp(file,'(\r?\n){2}','split'), 'UniformOutput', false);
因此,基本上可以通过出现两个换行符(Linux)或两个返回换行符(Windows)进行拆分。每个生成的字符串都将转换为一个矩阵

这里有一个警告
str2num
在内部调用
eval
,因此它可能运行潜在的危险代码。例如,文件可以包含
!rm*
,这将被执行。为了避免这种情况,您可以检查文件是否只包含数字、空白字符、小数点和加号/减号:

valid = all(ismember(file, ['0':'9' 1:32 '.+-']));
并且仅当
有效
时才继续

该代码给出了矩阵的单元数组,每个块位于一个单元中。对于您的示例文件

>> 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

我会这样做:

bs = cellfun(@str2num, regexp(file,'(\r?\n){2}','split'), 'UniformOutput', false);
因此,基本上可以通过出现两个换行符(Linux)或两个返回换行符(Windows)进行拆分。每个生成的字符串都将转换为一个矩阵

这里有一个警告
str2num
在内部调用
eval
,因此它可能运行潜在的危险代码。例如,文件可以包含
!rm*
,这将被执行。为了避免这种情况,您可以检查文件是否只包含数字、空白字符、小数点和加号/减号:

valid = all(ismember(file, ['0':'9' 1:32 '.+-']));
并且仅当
有效
时才继续

该代码给出了矩阵的单元数组,每个块位于一个单元中。对于您的示例文件

>> 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

定义“不工作”-给出一个特定的错误,匹配错误的值,以某种方式变得有意识,并且您无法阻止它进行清洗…正则表达式的预期结果是什么?您可以使用strsplit(文件'\r\n\r\n')@Wolfie:谢谢您的评论,fixed
importdata
在本例中应该可以正常工作。定义“不工作”-给出特定错误,匹配错误值,以某种方式变得有意识,并且您无法阻止它进行清洗…正则表达式的预期结果是什么?您可以使用
strsplit(文件“\r\n\r\n”)
@Wolfie:谢谢您的评论,修复了
importdata
在本例中的问题。@Sven:谢谢。然而,cellfun(@str2double,区域);导致:统一输出中的非标量,在索引1处,输出1。我将“UniformOutput”设置为false。如何将面积转换为矩阵?(*)是个错误。是的,的确如此。我没有检查代码。我的错。。。我会编辑我的答案…@Sven:谢谢。然而,cellfun(@str2double,区域);导致:统一输出中的非标量,在索引1处,输出1。我将“UniformOutput”设置为false。如何将面积转换为矩阵?(*)是个错误。是的,的确如此。我没有检查代码。我的错。。。我将编辑我的答案。。。