我想知道一个单元格是否包含子字符串foo
,并且在可能包含foobar
的一系列单元格中仅包含此字符串(之前没有,之后没有(。
我目前在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
。
事先非常感谢。
regexp
在这里有些过头了,ismember
是一个专门为在单元格中查找精确字符串而设计的内置函数
idx_to_delete = ismember( potentialfields, selected_fields );
如果你真的设置在regexp
上,你可以使用起始锚(^
(和结束锚($
(,如下所示:
pattern = ['^(', strjoin( selected_fields, '|' ), ')$'];
idx_to_delete2 = ~cellfun( @isempty, regexp( potentialfields, pattern ) );
您可以动态构建基于单词边界的正则表达式:
pattern = strcat('<(', strjoin(diffset,'|'), ')>')
idx_to_delete=~cellfun(@isempty,regexp(potentialfields,pattern))
使用strjoin(diffset,'|')
,您可以创建交替模式,而<(...)>
是一个用单词边界包裹的分组结构,只匹配单词边界适用于每个交替的开始和结束字符的整个单词。