正则表达中神秘的不匹配

时间:2014-09-19 13:21:22

标签: regex matlab

想象一下,我有一个包含两个文件名的单元格数组:

filenames{1,1} = 'SMCSx0noSat48VTFeLeakTrace.txt';
filenames{2,1} = 'SMCSx0NoSat48VTrace.txt';

我想获取以'SMCSx0'开头并包含过滤字'NoSat48VTrace'的文件名:

%// case 1
expression = 'SMCSx0';
filterword = 'NoSat48VTrace';
regs = regexp(filenames, ['^' expression '.*\' filterword '.*\.txt$'])
mask = ~cellfun(@isempty,regs);
file = filenames(mask)

它有效,我明白了:

file = 

    'SMCSx0NoSat48VTrace.txt'

但无论出于何种原因,将过滤字更改为'noSat48VTFeLeakTrace'都不会让我获得另一个文件?

%// case 2
expression = 'SMCSx0';
filterword = 'noSat48VTFeLeakTrace';
regs = regexp(filenames, ['^' expression '.*\' filterword '.*\.txt$'])
mask = ~cellfun(@isempty,regs);
file = filenames(mask)

与以前完全相同,但是

file = 

   Empty cell array: 0-by-1

我实际上在函数中使用这些行数月,没有问题。但是现在我在我的文件夹中添加了一些找不到的文件,尽管它们的名字与以前类似。任何提示?


实际上它应该在没有将Trace包含在过滤字中的情况下工作,这是第一种情况,这就是我将.*\放入正则表达式的原因。

%// case 1
expression = 'SMCSx0';
filterword = 'NoSat48V';
... works

2 个答案:

答案 0 :(得分:2)

'^' expression '.*\'

靠近末尾的\会使\n被解释为换行符:

SMCSx0.*\noSat48VTFeLeakTrace.*\.txt$

这适用于其他滤镜,因为NoSat48VTrace的大写N\N被解释为N

摆脱\,你不需要它。

答案 1 :(得分:1)

你有一个额外的反斜杠:

regs = regexp(filenames, ['^' expression '.*\' filterword '.*\.txt$'])
                                           ^^^
                                           |||

删除它,它应该给出预期的结果。