Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在单元格数组上使用Matlab regexp返回特定的文件名_Arrays_Regex_Matlab_Cell - Fatal编程技术网

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

Arrays 在单元格数组上使用Matlab regexp返回特定的文件名,arrays,regex,matlab,cell,Arrays,Regex,Matlab,Cell,我有一个文件夹,其中有许多文件,我想创建一个矩阵,其中包含具有特定模式的文件名。例如:该文件夹包含从主题号(例如03T1A.XXX.NII、03T1A、YYY.NII)开始的文件以及中间具有特定模式的文件名(例如03T1A.C100.NII、03T1A.C2.NII、03T1A.C300、NII)。在这个特定的情况下,我想用模式C1和C2在中间提取所有文件名(例如03T1A.C100.NII和03T1A.C2.NII,但不是03T1A.C300。NII)。p> 到目前为止,我已使用以下代码在“p

我有一个文件夹,其中有许多文件,我想创建一个矩阵,其中包含具有特定模式的文件名。例如:该文件夹包含从主题号(例如03T1A.XXX.NII、03T1A、YYY.NII)开始的文件以及中间具有特定模式的文件名(例如03T1A.C100.NII、03T1A.C2.NII、03T1A.C300、NII)。在这个特定的情况下,我想用模式C1和C2在中间提取所有文件名(例如03T1A.C100.NII和03T1A.C2.NII,但不是03T1A.C300。NII)。p> 到目前为止,我已使用以下代码在“pattern”中创建了一个模式匹配变量,我希望将其应用于通过dir调用提取到变量“all_files”中的文件名单元格数组

func_path = char(strcat(input_dir, '/', subs(files), '/Func'));
pattern = 'c[12]*.nii'
all_files = dir(func_path); 
all_files = {all_files.name};
我想使用(read.practice)regexp,使用字符串输入似乎很容易,但我100%地困惑于如何使用单元格输入。 我开始尝试这样做:

files = all_files(cellfun(@(x)regexp(x, pattern));
但很明显,它不起作用。如果我的最终目标是得到一个只包含相关文件名的矩阵输出,有人能帮我弄清楚该怎么做吗?我一直在搜索MATLAB答案和其他堆栈溢出帖子,但我的部分问题是我不明白他们的代码片段中发生了什么。我从另一篇文章中获取了上面的行(或者至少是它的开头),但是我不知道,例如,“x”是什么(一个输出变量?),或者在更大的命令中发生了什么,例如

fin = cellfun(@(x)regexp(x, '\.', 'split'), res, 'UniformOutput', false)
我在另一个帖子里找到的。
因此,基本上,有人能帮我找出一个可以工作的命令,同时向我解释它吗?

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

  • 不要使用strcat和
    '/'
    字符来构造文件路径。在连接之前,从所有输入中修剪空白(文件名可能有实际的前导或尾随空白),也不要硬编码文件路径分隔符(如
    “/”
    ),而是使用或更好地使用来构造路径,以确保它在各种平台上正常工作

    func_path = fullfile(input_dir, subs(files), 'Func');
    
  • 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};
    
  • 您的模式不匹配任何文件,因为它当前只匹配包含“c”的字符串,在文件扩展名之前只有零个或多个1或2。相反,您需要使用
    *
    来匹配“c1”或“c2”与文件名之间的任何内容。另外,您不希望在
    [12]
    之后使用
    *
    ,因为它实际上与
    c3
    匹配,因为它有零1或2。此外,您还需要对
    .nii
    中的
    进行转义,以便它不会被视为通配符。对于您的模式,我会使用类似

    pattern = 'c[12].*\.nii';
    
  • 如果您真的不想使用正则表达式,您可以通过简单地


  • regexp
    在cell数组上本机工作,无需使用
    cellfun
    。另请参见:作为构建的游乐场。我最初尝试使用命令:x=regexp(all_files,pattern,'match'),但它返回一个与'all_files'大小相同的空单元格数组。然后您的
    模式与任何内容都不匹配。天哪,您完全正确。如果我有c1004.EXAMPLE.nii和c2004.EXAMPLE.nii文件,出于某种原因,模式“c[12]*.nii”不会返回任何内容,但模式“c[12]”会正确返回这两个文件。有什么原因吗?@chainhomelow是的,因为
    c[12]*.nii
    将只匹配一个“c”,在
    .nii
    之前只跟1和2。您需要
    c[12].\.nii
    ,这样您就可以匹配
    c1
    c2
    与扩展名之间的字符串中的所有其他内容,非常感谢您,这确实起到了作用。我在查看regexp的使用情况,是的,通配符的问题让我很生气。显然,您也可以使用'c[12]\S*nii',但语法上的更改让我感到困惑。strcat注释也非常有用,“isempty”行用于完整性,为我提供了所需的新数组。非常感谢。
    c1_files = dir(fullfile(func_path, '*c1*.nii'));
    c2_files = dir(fullfile(func_path, '*c2*.nii'));