如何在 MATLAB 中使用正则表达式来严格匹配子字符串而不是包含该子字符串的较大字符串?

How to use regexp in MATLAB to strictly match a substring and not a larger string containing that substring?

我想在可能包含 foobar.[=25= 的一系列单元格中查找一个单元格是否包含子字符串 foo 并且仅包含此字符串(之前没有,之后没有) ]

我目前在 MATLAB 中使用 regexp 并希望调整搜索模式 regexp 以排除包含包含我定义的子字符串的字符串的单元格。

我知道这有点违背 regexp 的想法,但我相当确定有一种方法可以做我想做的事情。

作为 MWE,这是我拥有的数据片段(单元格格式),称为 potentialfields:

'horaracha'
'sol'
'presmax'
'horapresmax'
'presmin'
'horapresmin'

和我目前使用的 regexp 表达式:

selected_fields={'sol','presmin'};
diffset=setdiff(potentialfields,selected_fields);
pattern=strjoin(diffset,'|');
idx_to_delete=~cellfun(@isempty,regexp(potentialfields,pattern));

idx_to_delete 的预期输出如下:

1 0 1 1 0 1

目前,输出是 1 0 1 1 1 1 因为 horapresmin 包含 presmin.

非常感谢您。

您可以动态构建基于单词边界的正则表达式:

pattern = strcat('\<(', strjoin(diffset,'|'), ')\>')
idx_to_delete=~cellfun(@isempty,regexp(potentialfields,pattern))

使用 strjoin(diffset,'|'),您将创建交替模式,而 \<(...)\> 是一个用单词边界包裹的分组结构,仅匹配单词边界适用于每个替代开始和结束字符的整个单词.

regexp 在这里有点矫枉过正,ismember 是一个内置函数,专门用于在单元格中查找确切的字符串

idx_to_delete = ismember( potentialfields, selected_fields );

如果您真的喜欢 regexp,您可以像这样使用开始锚点 (^) 和结束锚点 ($):

pattern = ['^(', strjoin( selected_fields, '|' ), ')$'];
idx_to_delete2 = ~cellfun( @isempty, regexp( potentialfields, pattern ) );