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

Using Matlab regexp on a cell array to return specific filenames

我有一个文件夹,其中有许多文件,我想创建一个矩阵,其中包含具有特定模式的文件名。例如:该文件夹包含名称以主题编号开头的文件(例如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)。

至此,我已使用以下代码在"模式"中创建模式匹配变量,该变量要应用于通过dir调用提取到变量" all_files"中的文件名单元格数组。

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

我想使用(阅读练习)正则表达式,使用字符串输入来完成它似乎很容易,但是我对如何使用单元格输入感到十分困惑。
我开始尝试做这样的事情:

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

但这显然行不通。如果我的最终目标是获取仅包含相关文件名的矩阵输出,有人可以帮我弄清楚该怎么办吗?我一直在搜索MATLAB答案和其他Stack Overflow帖子,但是部分问题是我不了解他们的代码段中正在发生什么。我从另一篇文章中摘录了上面的行(至少是它的开头),但是我不知道例如," x"是什么(输出变量?)或诸如此类的较大命令中的内容

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

我在另一个线程中发现的。
因此,基本上,有人可以在向我解释该命令的同时帮助我找出一个可以使用的命令吗?


有关执行此类操作的一些建议

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

    1
    func_path = fullfile(input_dir, subs(files), 'Func');
  • regexp直接在单元阵列上工作,因此您可以简单地执行以下操作:

    1
    2
    3
    4
    5
    6
    7
    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};
  • 您的模式不匹配任何文件,因为它当前仅匹配包含文件扩展名前带有零个或多个1或2的" c"的字符串。相反,您需要使用.*来匹配" c1"或" c2"与文件名之间的所有内容。另外,您也不想在[12]之后使用*,因为它实际上与c3相匹配,因为它的零个1或2。另外,您还希望转义.nii中的.,以免将其视为通配符。对于您的模式,我会使用类似

    1
    pattern = 'c[12].*\\.nii';
  • 如果您确实不想使用正则表达式,则可以通过在dir调用中仅使用通配符来避免所有这些情况

    1
    2
    c1_files = dir(fullfile(func_path, '*c1*.nii'));
    c2_files = dir(fullfile(func_path, '*c2*.nii'));