如何在MATLAB中使用regexp来严格匹配子字符串,而不是包含该子字符串的较大字符串



我想知道一个单元格是否包含子字符串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,'|'),您可以创建交替模式,而<(...)>是一个用单词边界包裹的分组结构,只匹配单词边界适用于每个交替的开始和结束字符的整个单词。

相关内容

  • 没有找到相关文章

最新更新