在单元格数组上使用Matlab regexp返回特定的文件名

时间:2017-01-27 14:27:46

标签: arrays regex matlab cell

我有一个文件夹,其中有很多文件,我想创建一个包含特定模式的文件名的矩阵。例如:该文件夹包含名称以主题编号开头的文件(例如03T1A.xxx.nii,03T1A.yyy.nii)以及中间具有特定模式的文件名(例如03T1A.c100.nii,03T1A.c200。 nii,03T1A.c300.nii)。在这个特定的情况下,我希望提取所有文件名中间的模式c1和c2(例如03T1A.c100.nii和03T1A.c200.nii但不是03T1A.c300.nii)。

到目前为止,我已使用以下代码在'pattern'中创建模式匹配变量,我想将其应用于我已提取到变量中的文件名的单元格数组'all_files'通过 dir 调用。

func_path = char(strcat(input_dir, '/', subs(files), '/Func'));
pattern = 'c[12]*.nii'
all_files = dir(func_path); 
all_files = {all_files.name};

我想使用(阅读。练习)正则表达式并且使用字符串输入执行此操作似乎很容易,但我对如何使用单元格输入进行了100%的难题。 我开始尝试做这样的事情:

files = all_files(cellfun(@(x)regexp(x, pattern));

但显然它不起作用。如果我的最终目标是获得只有相关文件名的矩阵输出,有人可以帮我弄清楚该怎么做吗?我一直在搜索MATLAB的答案和其他Stack Overflow帖子但我的部分问题是我不明白他们的代码片段中发生了什么。我从另一个帖子中取了上面一行(或者至少是它的开头),但是我不知道是什么,例如,'x'(输出变量?)或者在较大的命令中发生了什么,例如< / p>

fin = cellfun(@(x)regexp(x, '\.', 'split'), res, 'UniformOutput', false)

我在另一个帖子中找到了。 所以基本上,有人可以帮我找出一个可以解释它的命令吗?

1 个答案:

答案 0 :(得分:2)

有关做这类事情的一些建议

  1. 请勿使用strcat'/'字符构建文件路径。 strcat在连接之前修剪所有输入的空格(文件名可能有实际的前导或尾随空格),而不是硬编码文件路径分隔符,例如'/',使用filesep或更好然后使用fullfile构建路径以确保它可以在各种平台上正常工作。

    func_path = fullfile(input_dir, subs(files), 'Func');
    
  2. regexp直接在单元格数组上运行,因此您只需执行以下操作:

    all_files = dir(func_path); 
    
    % Search for the pattern in all filenames
    matches = regexp({all_files.name}, pattern);
    
    % Get the filenames of those that matched
    all_files = {all_files(~cellfun('isempty', matches)).name};
    
  3. 您的模式不匹配任何文件,因为它目前只匹配包含&#34; c&#34;在文件扩展名之前零或更多1或2或<2>。相反,您希望使用.*来匹配之间的任何&#34; c1&#34;或&#34; c2&#34;和文件名。此外,您还希望*之后使用[12],因为这实际上会与c3匹配,因为它有0或1&2& #39; S。此外,您还想要转义.中的.nii,以免它被视为通配符。对于你的模式,我会使用像

    这样的东西
    pattern = 'c[12].*\.nii';
    
  4. 如果您真的不想使用正则表达式,可以通过using wildcards in your dir call

    来避免所有这些
    c1_files = dir(fullfile(func_path, '*c1*.nii'));
    c2_files = dir(fullfile(func_path, '*c2*.nii'));