• ベストアンサー

シェルで使われる正規表現について

シェル(UNIX)で使われる正規表現ですが、 メタ文字に、アスタリスク「*」があるのですが、 「A*Z」と「Ab*Z」でマッチするパターンですが、 例えば、以下の様な文字列があるとします。 AZ AbZ AbcZ AbcdZ AbcdeZ 「A*Z」でマッチさせると AZ AbZ AbcZ AbcdZ AbcdeZ となり、 「Ab*Z」でマッチさせると AZ AbZ となります。 何故、「A*Z」ではすべてがマッチの対象になるのですか。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

念の為に確認したいのですが、grep等の正規表現を使うコマンドでの話ですね? ls *.txt とかのファイル名展開では無いですね? *は「直前の表現の0回以上のくりかえし」です。ということは、「0回」のときもあるのです。 A*Zの場合 マッチするのは Z AZ AAZ AAAZ ... 等です。 AZ→A*は「Aが1つ」にマッチ、表現全体では「AZ」にマッチ AbZ→A*は「Aが0」にマッチ、表現全体では「Z」にマッチ、「Ab」はマッチとは無関係 AbcZ→A*は「Aが0」にマッチ、表現全体では「Z」にマッチ、「Abc」はマッチとは無関係 AbcdZ→A*は「Aが0」にマッチ、表現全体では「Z」にマッチ、「Abcd」はマッチとは無関係 AbcdeZ→A*は「Aが0」にマッチ、表現全体では「Z」にマッチ、「Abcde」はマッチとは無関係 Ab*Zの場合 マッチするのは AZ AbZ AbbZ AbbbZ ... 等です。 AZ→b*は「bが0」にマッチ、表現全体では「AZ」にマッチ AbZ→b*は「bが1つ」にマッチ、表現全体では「AbZ」にマッチ AbcZ→0個以上のbの直後にZが来ないので、マッチしない AbcdZ→0個以上のbの直後にZが来ないので、マッチしない AbcdeZ→0個以上のbの直後にZが来ないので、マッチしない > 何故、「A*Z」ではすべてがマッチの対象になるのですか。 上記のように、Z だけでもマッチします。 そして、指定しなければ、パターンがどの部分にあってもかまいません。 AbcdeZの全体がパターンと一致するかを調べたいとか、「Aから始まって」とか「Aが1個以上」とかにしたいのなら、そのような表現を使う必要があります。

abc999xyz
質問者

お礼

説明不足ですみません。 grep等の正規表現を使うコマンドでの話です。 詳しい説明ありがとうございます。 勉強になります。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.5

それって、正規表現じゃなくて、シェルのファイルマッチでは? * ・・・・ 0文字以上の任意の文字列(正規表現の .* ) ? ・・・・ 任意の1文字 (正規表現の . ) 他に[ ]や{ }もあります。 シェル自体では正規表現は扱えませんが(grepやsedやawkやexpr等の外部コマンドが必要)。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.4

Windowsの*と混同している(^^) *アスタリクタは「0個以上」ですよ。 +は一個以上 A*Z は、Aが0個でもマッチしますから、Aの有無・数に関係なく AZ ^^マッチ AbZ  ^マッチ AbcZ   ^マッチ AbcdZ   ^マッチ AbcdeZ    ^マッチ します。 Ab*Zだと、Aに続いてゼロ個以上のbを挟んだZですから AZ ^^マッチ AbZ ^^^マッチ AbcZ   マッチしない AbcdZ   マッチしない AbcdeZ   マッチしない 当然ですが A*Zは、Zを含むすべての単語にマッチします。 Ab*Zは、AZ、AbZ、AbbZ、AbbbbZ、AbbbbbbbbbZ、AbbbbbbbbbbbZなどにもマッチします。

abc999xyz
質問者

お礼

詳しい説明ありがとうございます。 勉強になります。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

正規表現における * は単独では用いられず 「直前文字の0回以上の繰り返し」という意味を持つから。 したがって, 正規表現 A*Z でマッチする例は Z AZ AAZ AAAZ などであり, 正規表現 Ab*Z でマッチする例は AZ AbZ AbbZ AbbbbZ などになります。 「任意文字の0回以上の繰り返し」と言いたければ .* です。

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

一応確認ですが, その「マッチさせる」というのは具体的にはどのような操作なんですか?

関連するQ&A

  • 正規表現*について

    LPICレベル1 翔泳社の本を参考にして試験対策をしていますが、p121の0回以上繰り返えす*でab*zでマッチするのが「az」「abz」「abbz」とあります。しかし、「az」はlsコマンドで試してみましたが引っかかりません。 この本が間違っているのでしょうか? シェルはbashを用いています。(REDHAT9) 回答のほどよろしくお願い致します。

  • 正規表現

    $ grep -E ^a.*$z abc.txt ある書籍の中で、上記のコマンドでマッチする文字列として、 "az"が挙げられているのですが。 "."は一般に任意の1文字と説明されていますが、"az"では"."がゼロ文字として扱われているように思えるのですが。任意の1文字にはゼロ文字も含まれるのでしょうか?

  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現 Bシェル

    Bシェルの正規表現を教えてください。 ある文字列の中に英数大文字、小文字、コンマ、ピリオド、アンダーバー、ハイフン以外が含まれていないかをチェックしたいです。以下のようにすると文字列LINEの先頭にあるとチェックできるのに、中にあると出来ません。教えてください。 if expr \"$LINE\" : [^a-zA-Z0-9\\,\\.\\_\\-] >/dev/null ; then echo \"チェックNG 使用不可能な文字が入っています。 ${LINE}\" >> ${LOG_FILE} else echo \"チェックOK ${LINE}\" >> ${LOG_FILE} fi

  • 正規表現[0-9]

    ある文字列が大文字のアルファベット(A~Z)で構成されていることを正規表現を用いてチェックしたいと思ってます。 例えば "A0001" という文字列が A~Z で構成されているかを判断しるにはどうしたらよいですかね?? PatternクラスとかMatcherクラスとかを使用するみたいなんですが、なんかよくわかりません。 以下のように動かしたんですが、全く動きません。 boolean result_flag=false; if("A0001"=[A-Z]){   result_flag=true; } Javaおよびプログラム初心者でわかりずらくてすいませんが、 どうかお助けをよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 正規表現。行頭が○○以外にマッチさせたい。

    正規表現を勉強しています。行頭がxyzという文字列以外をマッチさせたいと思っています。行頭にマッチさせるには"^xyz"と理解できます。[^xyz]とやるとx,y,z以外の文字列にマッチするのもわかります。ただ、これだと 123 xyz の文字にもマッチしていまいます。行頭がxyzで続く文字列以外にマッチさせる正規表現はどうかけばよろしいでしょうか?

  • 正規表現の実行レポートは作成可能でしょうか?

    開発言語:Perl(Win32) ヴァージョン:5.8.4.810 perl.exeのプロパティー参照 長文の正規表現にパターンマッチを試みているのですが、 本来マッチするはずの文字列に対して、マッチしません。 しかし、正規表現が長文のため、なかなかデバッグが進みません。 どのように、パターンマッチが進んでいるか見ることが出来ればデバック作業が早くなると思うのですが、 私はその方法を知りません。 そこで、質問なのですが、Perlが正規表現をどのように解釈して、パターンマッチを進めているか、確認する方法はないのでしょうか? できれば、パターンマッチ実行中、解釈している位置と、文字列をレポートとして出力する方法があれば、それを知りたいと思います。

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

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現にて質問があります。

    テスト勉強をやっていて過去問をみたら正規表現の部分だけわからずにいます (1)α=(0|10)*2(1|00|010)+ (2)α=(ab|c)*c(bc|a)+ (3)α=(1|22)*a(333|4444)* (1)正規表現αが表す文字列内、文字列長が1のものすべてを列挙せよ (2)正規表現αが表す文字列内、文字列長が2のものすべてを列挙せよ (3)正規表現αが表す文字列内、文字列長が3のものすべてを列挙せよ (4)正規表現αが表す文字列内、文字列長が4のものすべてを列挙せよ の答えを教えてもらえないでしょうか? もしよろしければどうやってとけばいいかのアドバイスもお願いします

  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。