MATLAB: What is the function of a question mark ‘?’ in regular expression

question markregular expression

If I have a C code text with two comments like below and I want to use matlab regular expression function to remove all the comments in the C file called "myTextFile.txt"
/* This is my first comment */
void myCfun(void){}
/* This is my second comment */
Below is my first matlab script, which does not work well:
mytext = fileread('myTextFile.txt');
searchPattern = '/\*.*\*/';
matchedString = regexp(mytext,searchPattern,'match');
The result is:
matchedString = {' This is my first comments */void myCfun(void){}/* This is my second comment */'};
In the C file there should be two comments, however, without a question mark, the matlab regexp function include all the text between the first '/*' and the last '*/'. This is not what I want.
Then I modifed the search pattern as the following:
mytext = fileread('myTextFile.txt');
searchPattern = '/\*.*?\*/';
matchedString = regexp(mytext,searchPattern,'match');
This time it gives the right answer:
matchedString = {' This is my first comments', ' This is my second comment'};
I don't understand what the question mark does in the above example?

Best Answer

Let's interpret the 1st searchPattern.
searchPattern = '/\*.*\*/';
% /\* start with /*
% .* allow for any character(s) (Greedy!)
% \*/ keep searching until you get to the LAST */
This matches all of your text because your text begins with /* and ends with */. It doesn't care that there's another */ before the last one. This is known as a greedy search.
Let's interpret the 2nd searchPattern
searchPattern = '/\*.*?\*/';
% .*? allow for any character(s) until you get to....
% \*/ ....the first time this occurs
This match ends at the next */ unlike the above match that ends at the last */.