If Regexp matches return 1 otherwise 0 syntax
Ältere Kommentare anzeigen
Hi,
Right now I'm using the following to get a boolean result from a regexp. It just doesn't feel right - is there a better way to do this?
(size(regexp(myInput,myPattern),1)>0)
1 Kommentar
Azzi Abdelmalek
am 25 Mär. 2013
What do you mean?
Akzeptierte Antwort
Weitere Antworten (4)
If your input to regex is a cell array (say from collecting from a struct or something), then your output will be a cell array which is not immediately able to be used for logical indexing. You need to convert it from a cell array to a logical array. But many times you'll get empty cells so you can't just use cell2mat because that will implicitly ditch the empty cells and only leave you with the non-empty which doesn't help for indexing. Therefore, I use this following approach to go from an input of a cell array to an output of a logical array.
This is how I get a logical array out of regex:
logicalMatches = ~cellfun('isempty', regexpi({filesInDir.name}, stringToBeFound, 'once'));
1 Kommentar
James Van Zandt
am 12 Mai 2022
I have a cell array of strings to test, so I used this method to collect the matches.
K>> ca={'able','baker','charlie','delta','echo','fox','golf','hotel'}
ca =
1×8 cell array
{'able'} {'baker'} {'charlie'} {'delta'} {'echo'} {'fox'} {'golf'} {'hotel'}
K>> regexp(ca,'a')
ans =
1×8 cell array
{[1]} {[2]} {[3]} {[5]} {0×0 double} {0×0 double} {0×0 double} {0×0 double}
K>> ~cellfun('isempty',regexp(ca,'a'))
ans =
1×8 logical array
1 1 1 1 0 0 0 0
Sean de Wolski
am 25 Mär. 2013
doc strfind %?
a more modern solution:
% for reproducibility
rng(0);
% 10 strings
strSize = [10 1];
% 10 characters in each string
numChars = 10;
% only lowercase Latin characters
unicodeBnds = [97 122];
%
myInput = arrayfun(@(a) string(char(randi(unicodeBnds,[1 numChars]))),ones(strSize))
myPattern = "[abc]";
contains(myInput,regexpPattern(myPattern))
4 Kommentare
this is nice but doesn't work on a cell array unless you use:
cellfun(@(x) contains(x, regexpPattern(myPattern)), myInput)
Walter Roberson
am 17 Dez. 2025
The original solution (size(regexp(myInput,myPattern),1)>0) was also not generalizable to cell arrays myInput so I do not think this was a consideration for the original poster.
@gwoo if `myInput` is a properly formatted cell string, then my solution should work. I suspect that you had a cell array of 1-by-1 strings, rather than a cell array of character vectors.
% for reproducibility
rng(0);
% 10 strings
cellSize = [10 1];
% 10 characters in each string
numChars = 10;
% only lowercase Latin characters
unicodeBnds = [97 122];
%
myInput = cellfun(@(c) char(randi(unicodeBnds,[1 numChars])),repmat({1},cellSize),'UniformOutput',false)
myPattern = '[abc]';
contains(myInput,regexpPattern(myPattern))
gwoo
am 18 Dez. 2025
Azzi Abdelmalek
am 25 Mär. 2013
0 Stimmen
Maybe you want to use isequal or strcmp
Kategorien
Mehr zu Characters and Strings finden Sie in Hilfe-Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!