• ベストアンサー

正規表現 .+? について

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

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

「?」はPOSIXを含むいわゆる正規表現では0か1回マッチするという意味です ({0,1}とほぼ同意) 最短マッチに使うのはPerl互換ですね 「tmp.+?/」は「tmpに続く『何か1文字以上の文字』が『0回または1回』出現する」 なので「tmp/」にマッチすると考えられます

noname#241088
質問者

お礼

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

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

後者の質問については「+ と * の違い」といえば十分だろう. 前者は .+? が「任意の文字からなる 1文字以上の文字列」と言っておけばわかる?

noname#241088
質問者

お礼

回答ありがとうございます。 >前者は .+? が「任意の文字からなる 1文字以上の文字列」と言っておけばわかる? 検索パターンが次ようなイメージでしょうか? tmp<1文字以上の任意文字列>/<1文字以上の任意文字列>foo<...この部分は略...> この場合、検索対象文字列 "tmp/foo.txt" に関して tmp と / の間、/ と foo の間には1文字以上の任意の文字列が存在しないのですが、何故マッチするのでしょうか?

関連するQ&A