参数(1-5)a b c d e
参数(96-100)ex1 ex2 ex(3)ex4 ex5
参数(101-105)ex1 ex2 ex3 ex(4)ex5
我在单元格数组中有每一行,所以当我读取它时,我希望能够忽略参数及其在括号内的任何内容......我使用了REGEX但它也忽略了实际参数中的括号前(4)和我一直在尝试我所知道的所有不同方式,这让我发疯。
我希望能够忽略单词'PARAMETERS(内部无论如何)',而不会忽略特定数量的字符,因此如果文件除了更改之外的任何内容都不会崩溃单词PARAMETERS和除此之外的括号。
请帮助!
答案 0 :(得分:0)
答案 1 :(得分:0)
我假设最终结果是在每行的末尾提取5个字符串,在这种情况下,您可以通过两次调用REGEXP来执行此操作:
>> C = {'PARAMETERS( 1- 5) a b c d e';...
'PARAMETERS( 96-100) ex1 ex2 ex(3) ex4 ex5';...
'PARAMETERS(101-105) ex1 ex2 ex3 ex(4) ex5'};
>> sub = regexp(C, 'PARAMETERS\([^\)]+\)(.+)', 'tokens', 'once');
>> tokens = regexp(vertcat(sub{:}), '(\S+)', 'tokens');
>> tokens = cellfun(@(c) c{1}, vertcat(tokens{:}), 'UniformOutput', false)
tokens =
'a' 'b' 'c' 'd' 'e'
'ex1' 'ex2' 'ex(3)' 'ex4' 'ex5'
'ex1' 'ex2' 'ex3' 'ex(4)' 'ex5'
正如您所看到的,删除封闭的单元格数组时会出现很多混乱。
答案 2 :(得分:0)
以下是如何在不使用正则表达式的情况下删除第一个右括号之前的所有内容,这在Matlab中可能非常慢 - 使用strfind
:
str = {'PARAMETERS( 1- 5) a b c d e',
'PARAMETERS( 96-100) ex1 ex2 ex(3) ex4 ex5',
'PARAMETERS(101-105) ex1 ex2 ex3 ex(4) ex5'};
str2 = cellfun(@(c1,c2)c1(c2(1)+2:end),str,strfind(str,')'),'UniformOutput',false)
如果数据最初位于文件中,则可能最好使用textscan
(如果可能)。但是,一旦它是单元格数组中的一堆行,textscan
可能也不会起作用。但是你仍然可以尝试看看它在你的情况下有多快/多快:
str2 = cellfun(@(c)textscan(c,'%s','CommentStyle',{'P',')'}),str);
[str2{:}]'
返回:
ans =
'a' 'b' 'c' 'd' 'e'
'ex1' 'ex2' 'ex(3)' 'ex4' 'ex5'
'ex1' 'ex2' 'ex3' 'ex(4)' 'ex5'
或者,如果您不希望字符串的第二部分分开:
str2 = cellfun(@(c)textscan(c,'%s','CommentStyle',{'P',')'},'Delimiter',''),str);
[str2{:}]'
返回与strfind
解决方案相同的结果:
ans =
'a b c d e'
'ex1 ex2 ex(3) ex4 ex5'
'ex1 ex2 ex3 ex(4) ex5'