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。如何将面积转换为矩阵?(*)是个错误。是的,的确如此。我没有检查代码。我的错。。。我将编辑我的答案。。。