プロが教えるわが家の防犯対策術!

正規表現(egrepコマンド)の .+? とはどのようなパターンを意味するのでしょうか。
例1のケース(.+? の部分)が何故マッチするのかがわかりません。
また、例1, 2のケースは共にマッチしますが、
.+? と .*? の違いは何になるのでしょうか。

例1.
echo "tmp/foo.txt" | egrep "tmp.+?/.+?foo[^/]*$"

例2.
echo "tmp/foo.txt" | egrep "tmp.*?/.*?foo[^/]*$"

A 回答 (2件)

後者の質問については「+ と * の違い」といえば十分だろう.



前者は .+? が「任意の文字からなる 1文字以上の文字列」と言っておけばわかる?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>前者は .+? が「任意の文字からなる 1文字以上の文字列」と言っておけばわかる?
検索パターンが次ようなイメージでしょうか?
tmp<1文字以上の任意文字列>/<1文字以上の任意文字列>foo<...この部分は略...>

この場合、検索対象文字列 "tmp/foo.txt" に関して
tmp と / の間、/ と foo の間には1文字以上の任意の文字列が存在しないのですが、何故マッチするのでしょうか?

お礼日時:2014/09/04 10:31

「?」はPOSIXを含むいわゆる正規表現では0か1回マッチするという意味です


({0,1}とほぼ同意)
最短マッチに使うのはPerl互換ですね

「tmp.+?/」は「tmpに続く『何か1文字以上の文字』が『0回または1回』出現する」
なので「tmp/」にマッチすると考えられます
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

検索すると最短マッチが出てきたので何故マッチするのかわからずにいました。
正規表現にはPOSIXとPerl互換があるのですね。
お陰様ですっきりしました。
改めてありがとうごじました。

お礼日時:2014/09/04 12:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!