Arrays 在单元格数组上使用Matlab regexp返回特定的文件名
我有一个文件夹,其中有许多文件,我想创建一个矩阵,其中包含具有特定模式的文件名。例如:该文件夹包含从主题号(例如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”中的文件名单元格数组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
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)
我在另一个帖子里找到的。
因此,基本上,有人能帮我找出一个可以工作的命令,同时向我解释它吗?关于做这类事情的一些建议
'/'
字符来构造文件路径。在连接之前,从所有输入中修剪空白(文件名可能有实际的前导或尾随空白),也不要硬编码文件路径分隔符(如“/”
),而是使用或更好地使用来构造路径,以确保它在各种平台上正常工作
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};
*
来匹配“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'));