• ベストアンサー

perlの正規表現で量指定子を繰り返す意味

perlの正規表現で量指定子を繰り返す意味 とあるブログのプラグインのコードを読んでいて不思議に 思ったことがあります。 .* このような正規表現は良く見るのですが、 .*? というような表現を見て不思議に思っています。 この場合、まず「.」で改行以外の一文字が、「*」0個以上ある、 その後の「?」によって「0個または1個」となると思いますが、 これだと「*」の意味がないように思います。 こういった量指定子を繰り返すことにどういう意味があるのか 最初から「.?」ではなぜいけないのか、教えていただけませんか。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

「*?」の「?」は単独の量指定子ではなく「*」に対するオプション指定です。 「*」の場合は最長マッチになるのに対し、 「*?」で最短マッチになります。 つまり、たとえば、「abcabcabc」という文字列に対して、 「a.*a」は「abcabca」にマッチしますが、 「a.*?a」は「abca」にマッチします。

angband
質問者

お礼

ご回答ありがとうございます。 オプション指定ですか。勉強になりました。 おかげさまで納得して読み進めることができそうです。 ありがとうございました。

関連するQ&A

  • Perlで使える正規表現を教えて下さい。

    Perlで使える正規表現を教えて下さい。 半角英語で、小文字が3文字以上続いた後、大文字が来る場合、その大文字の右にスペースを入れる。 これをPerlで使える正規表現を教えて頂けないでしょうか? 例 $str = 'AaaAaaaBbbbbCccccDddBbA'; # Aaa Aaaa Bbbbb Ccccc DddBbA ちなみに、色々ネットで調べて試してみて、 $str =~ s/([a-z])([A-Z])/$1 $2/g; が最も近いコードになったのですが、2文字続いただけでもスペースが入り困っています。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 正規表現で分かりません

    例えば以下のようなパターンの正規表現チェックがあるのですが、 どのようなものを意味しているか分かりません。 教えていただけますでしょうか。 よろしくお願いします。 以下の情報は調べたのですが。 +(プラス)・・・直前の1文字の1回以上の繰り返しを表現 . (ピリオド)・・・改行コード以外の1文字にマッチするか否か [ ](大括弧)・・・囲みの中に書かれた任意の1文字にマッチするか否か ^([^ ]+) +[^ ]+.+S3.lzh

  • Perl 正規表現に関して

    現在Perlにて正規表現を用い,アクセス者のログが納めてあるlog.datからデータを検索し集計するといったアルゴリズムです. ところが正規表現を用いたのは良いものの,アルファベット以外をパターンとして使用したとき,データを呼び出すどころか表示されない状況に陥ってしまいました. elsif($referer =~ /abcd/i) { $word2 = "abcd"; } 上記のコードは,パターンがアルファベットで構成されているため,正常にシステムが動作します. elsif($referer =~ /あいうえ/i) { $word2 = "あいうえ"; } しかし,上記のコードはパターンが平仮名で構成されているため,冒頭で記している問題が発生してしまいます. そこで (1)パターンにアルファベット以外のものは使えるのか. (2)パターンにアルファベット以外のものを使いたいときはどうすればいいのか. についてお教えください. また正規表現のほかに,文字列を検索し,頻度をカウントすることに長けているコードがございましたらお教え願います. 以上の内容で不明な点等ございましたら随時対応致します. 宜しくお願いします.

    • ベストアンサー
    • Perl
  • Perl正規表現わかりますか?

    下記のPerl正規表現ですが、どんな意味か分かるでしょうか? $var =~ s!/([^/]+|~(\.\.))/\.\./!/!g 参考書も読んでみたのですが分かりませんでした(セットされている文字列にどんなマッチング、置換をしているのでしょう) お分かりの方いれば、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現について(Perl5準拠)

    HSPでプログラミングをしてるのですが、標準のHSPでは正規表現が使えないため、Perl5に準拠した正規表現が扱えるモジュールをインクルードして使っています。 正規表現初心者です。 プログラムのなかでファイのパスからファイル名だけにマッチするような正規表現を使いたいのですが上手くいきません。 具体的には c:円dir1円dir2円filename.xxxからfilename.xxxを抜き出すために ※円マークが質問に表示されないぬで「円」と書きました。 [^円]+$ という正規表現を考えました。意味は「円」以外の文字で始まる行末までの文字列という感じです。 「円」がメタ文字の為の記号だからダメなんでしょうか?自体を認識するためにはどのようにしたらいいのでしょうか? それとも正規表現がダメなんでしょうか? Perl5の場合でいいので、分かる方、教えてください。

  • Perlの正規表現

    Perlの正規表現である文字列に文字列STRINGが含まれないようにするには ^(?!.*STRING).+$ と書くとググったら出てきました. ですが,?!について詳しいことまで書いてるサイトはありませんでした. ?!は具体的にはどのようなことをするのでしょうか?

  • Perl・正規表現が分かりません

    Perlでプログラムを書く場合、 ある文字列の文字数が5文字且つ、文字列の先頭に[0-5A]を必ず含み、そして残り4文字にも[0-5A]のみを必ず含む場合、Trueを表示。 それ以外はErrを表示する。 多分、全て、正規表現でできると思うのですが、分かりません。教えていただけないでしょうか? 宜しくお願い致します。 $test = "0AAAA"; if(正規表現){ print "True"; }else{ print "Err"; } ↑結果:True $test = "aAAAA";の場合、 結果:Err

    • ベストアンサー
    • Perl
  • |。ってなんですか? 正規表現

    正規表現の学習中です。読んでいる本の中に次の式がありました。  (?<=^|。)[^。]+。 日本語の文章の中から一文を抽出するための正規表現です。  。以外の文字がダーッと連なった後に。が来る文字列 とのことです。  [^。]は。以外の文字  +はそれが1個以上ある ですから  [^。]+ は  。以外の文字が1個以上ある という意味です。 その後に。が付きますから、  [^。]+。 だけで  。以外の文字がダーッと連なった後に。が来る文字列 ということになります。 では  (?<=^|。) の意味は何でしょう。  (?<=なんたら) は後方参照を意味しますから、 ^|。 のすぐ後に [^。]+ が続くと言いたいのでしょうか。 だとすると  ^|。 が問題です。  ^もしくは。 という意味なら、^は正規表現で記号として使われている文字ですから、  \^|。 と表現されそうなものです。 それに、。は文末でしか利用されない文字ですから、これに注目して検索を行うというのは理解できますが、^は日本語でなんら特徴を持つ文字ではありません。  ^もしくは。 という理解は間違いでしょう。 それでは^を記号として考えるとして、その前後を[]で囲んでいないから、この^は文字列の先頭を表すのでしょうか。そうすると件の正規表現は  先頭の|。のすぐ後から。以外の文字が連なった後に。が来る文字列 という意味になります。日本語の一文を抽出する正規表現という解説にかなり近づいてはいます。 しかし  |。 とは一体何? |はorを意味する記号ですが、  何とか or 。 という意味でしょうか。 でも「何とか」は「何とか」なりに何か文字表現がなされていても良さそうですし、それに  先頭の「何とか」または。のすぐ後から・・・ という解釈は意味不明。  |。 はどのように解釈すべきなのでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • Perlの正規表現

    Perlの正規表現で質問です。 例えば、 "aabbccddee"と"cdde"という2種の文字列があるとして"cdde"だけを検索(または置換)したい場合の正規表現ってどのようにすればよいのでしょうか? いま、"cdde"で検索すると"aabbccddee"と"cdde"の2種類がヒットしてしまうのですが"cdde"だけヒットするような正規表現をどなたかご教示ください。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • perlの正規表現について

    perl初心者です。 早速ですが質問です。 複数のファイルが存在するフォルダ内にて、「~.abc.txt」というテキストファイルのみを 読み込みたい場合はどのように指定すればよいのでしょうか。 #open (F,○○)という表記になるかと思うのですが、 #適当な正規表現が分からず苦労しております。 お分かりになる方いらっしゃいましたら、ご教授してくださいませ。 以上です。 宜しくお願いいたします。

専門家に質問してみよう