Testing for the presence of a substring in a cell array of strings

42 visualizaciones (últimos 30 días)
*NEWBIE WARNING***
I have a very basic question but couldn't find an answer after searching.
I wish to test if a multi-element cell array of strings contains a substring anywhere within the cell array's text, returning a logical true or false answer. For example, given the cell array of strings x:
x = {'qwer','asdf','zxcv'};
I wish to test if the substring 'xc' is present somewhere in x's text (true in this example).
The method I came up with is as follows:
First, concatenate the elements of the cell array of strings into a single character string, preserving the original character order:
y = char(x);
y = y';
y = y(:)'; % y now equals 'qwerasdfzxcv'
Then, test for the presence of the substring in the concatenated string:
~isempty(strfind(y,'xc')) % ans = true
~isempty(strfind(y,'123')) % ans = false
Is there a better way to do this that involves less array manipulation? Thank you for your assistance.

Respuesta aceptada

Sean de Wolski
Sean de Wolski el 12 de Oct. de 2012
matches = strfind(x,'xc');
tf = any(vertcat(matches{:}))
  2 comentarios
Matt Fig
Matt Fig el 12 de Oct. de 2012
Editada: Matt Fig el 12 de Oct. de 2012
This can error if there is a different number of matches per string. For example:
x = {'qwerxc','xcaxcsdf','zxcvxcllxc'};
One could simply switch to using HORZCAT.
I would use:
tf = any(~cellfun('isempty',strfind(x,'xc')))
Schuyler
Schuyler el 14 de Oct. de 2012
Thank you for this clarification and for the suggestion to use HORZCAT.

Iniciar sesión para comentar.

Más respuestas (4)

per isakson
per isakson el 12 de Oct. de 2012
Editada: per isakson el 12 de Oct. de 2012
Here is a construct without implicit casting of types
is_xc = not( cellfun( @isempty, strfind( x, 'xc' ) ) );
and next
any( is_xc )
Easier to read
is_xc = cellfun( @has_value, strfind( x, 'xc' ) ) );
where
function has = has_value( input )
has = not( isempty( input ) );
end

Azzi Abdelmalek
Azzi Abdelmalek el 12 de Oct. de 2012
Editada: Azzi Abdelmalek el 12 de Oct. de 2012
x = {'qwer','asdf','zxcv'};
out=any(cell2mat(cellfun(@(y) regexp(y,'xc'),x,'un',0)))
or
out=any(cell2mat(regexp(x,'xc')))

Demetrio Rodriguez Tereshkin
Demetrio Rodriguez Tereshkin el 24 de Jul. de 2015
OP has already given, in my opinion, the best answer. Although it has to be corrected: isempty() always returns 1 for the type "cell", therefore we should use
cellfun(@isempty,strfind(y,'123'))

Schuyler
Schuyler el 12 de Oct. de 2012
Editada: Schuyler el 14 de Oct. de 2012
Wow, all three methods are great! I find:
matches = strfind(x,'xc');
tf = any(horzcat(matches{:}))
to be the simplest to visualize because it doesn't involve regular expressions or functions, but they are clearly all effective techniques. Thank you very much for the quick and helpful responses.
  1 comentario
Leo Simon
Leo Simon el 25 de Abr. de 2020
Editada: Leo Simon el 25 de Abr. de 2020
This code extends AA's answer to when you need to check if a substring of a string is contained in a cell array:
needLatexForThese = {'\bar','\ubar','\check','\hat'};
stringYes = '$\bar{x}$'
stringNo = '$x^\ast$'
f = @(s) any(cell2mat(cellfun(@(y) contains(s,y),needTexForThese,'un',0)));
f(stringYes)%returns 1
f(stringNo)%returns 0

Iniciar sesión para comentar.

Categorías

Más información sobre Characters and Strings en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by