フィルターのクリア

What is the function of a question mark '?' in regular expression

15 ビュー (過去 30 日間)
Rui Zhang
Rui Zhang 2019 年 8 月 1 日
コメント済み: madhan ravi 2019 年 8 月 2 日
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?
  1 件のコメント
madhan ravi
madhan ravi 2019 年 8 月 2 日
madhan ravi:
Rui Zhang:
I went to the website where you provided the link to.
My understanding is the question mark '?' is equivalent to {0, 1}. But that doesn't help me on my question.
In my examples, it looks like the question mark changes the search direction. Without it, the function seaches the given string from the last character; with it, it searchs the string from the first character. This is my perception that comes from my example above.

サインインしてコメントする。

採用された回答

Adam Danz
Adam Danz 2019 年 8 月 1 日
編集済み: Adam Danz 2019 年 8 月 1 日
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 */.
  6 件のコメント
Adam Danz
Adam Danz 2019 年 8 月 1 日
@Walter , great example. Thank you!
madhan ravi
madhan ravi 2019 年 8 月 2 日
+1, definitely it takes sometime to learn regex without a doubt as Adam said.

サインインしてコメントする。

その他の回答 (1 件)

カテゴリ

Help Center および File ExchangeString Parsing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by