Testing for the presence of a substring in a cell array of strings
37 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Schuyler
le 12 Oct 2012
Modifié(e) : Leo Simon
le 25 Avr 2020
*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.
0 commentaires
Réponse acceptée
Sean de Wolski
le 12 Oct 2012
matches = strfind(x,'xc');
tf = any(vertcat(matches{:}))
Plus de réponses (4)
per isakson
le 12 Oct 2012
Modifié(e) : per isakson
le 12 Oct 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
0 commentaires
Azzi Abdelmalek
le 12 Oct 2012
Modifié(e) : Azzi Abdelmalek
le 12 Oct 2012
x = {'qwer','asdf','zxcv'};
out=any(cell2mat(cellfun(@(y) regexp(y,'xc'),x,'un',0)))
or
out=any(cell2mat(regexp(x,'xc')))
0 commentaires
Demetrio Rodriguez Tereshkin
le 24 Juil 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'))
0 commentaires
Schuyler
le 12 Oct 2012
Modifié(e) : Schuyler
le 14 Oct 2012
1 commentaire
Leo Simon
le 25 Avr 2020
Modifié(e) : Leo Simon
le 25 Avr 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
Voir également
Catégories
En savoir plus sur Characters and Strings dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!