• ベストアンサー

正規表現について

正規表現について LPIC黒本の問題で1つ困っています。 $ grep -E ^A[^A]A[^A] lpic.txt にマッチする文字列 答え AaAa となっていますが理解できません。 そもそも正規表現ってなんでしょうか? あまり難しいようなら飛ばしますが、 となたか教えてくれるお方おりましたらお願いいたします。

  • denza
  • お礼率80% (647/806)

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

  • ベストアンサー
  • szk9998
  • ベストアンサー率45% (1024/2232)
回答No.1

grep -e 正規表現 ファイル名 というLinuxのコマンドはいいですよね。 正規表現となるのは、^A[^A]A[^A]ですが、 ・最初の^は、文字列(行)の最初にマッチすることを指示しています ・[^A]はA以外の文字を表しています  [ ]は、[ ]内に含まれる一文字にマッチすることを、  [ ]内の^は、それを否定します  すなわち、Aでない文字を指しています 以上から、 行頭の、A*A*(*はA以外の文字) となります。 lpic.txtの中身がわかりませんが、おそらく、AaAaという文字が 入っているのでしょう。 こういったことは、正規表現の文法をまとめたサイトに出ています 例えば http://www.komonet.ne.jp/~perl/chap7.htm 正規表現というのは、文字列を検索したり置換したりするための 文法ですよね。 試験ではどうか知りませんが、実際にはものすごく使うテクニック です。 プログラムにかかわらず、テキスト原稿の中の特定の文字を一括 で修正したり、データベースのデータを一括で修正したり・・・ あいまいな文字列の中から、特定の文字列を探し出すための有効 なテクニックとして認知されています

denza
質問者

補足

丁寧な説明ありがとうございます。 概略などはわかりました。 が、しかし1点 >最初の^は、文字列(行)の最初にマッチ は理解できます。 >[ ]内の^は、それを否定します これは最初に言っている「最初にマッチ」の"^"と違う意味になるのは なぜでしょうか? 全体的にわからなかったのですが、核心のわからない部分はここだったみたいです。

その他の回答 (1)

  • kachansa
  • ベストアンサー率44% (30/67)
回答No.2

|これは最初に言っている「最初にマッチ」の"^"と違う意味になるのは |なぜでしょうか? そういう風にルールを決めたからです。 []内にある場合とない場合で、^によるルールが異なるだけのことです。 もし、これが、[]内の^を~と最初にルールを決めて、実装されていれば、 そうなっていたかもしれません。

denza
質問者

お礼

やっとわかりました。 ちょうど今別のドキュメントでも書いてありました。 []内の"^"だとそれ以外の意味になるようですね。 そうゆう取り決めを気がつかないと、先頭のことなのになんで? となってしまっていました。 でもなんで紛らわしい表現なんでしょうね。 ありがとうございました。

関連するQ&A

  • 正規表現の達人にお聞きしたい。

    正規表現で、文字数は4文字ですが、そのうち1つでもaがあれば マッチするということで、1~3まではマッチし、 4はa無しなのでマッチせず、5は4文字でないのでマッチしない ような正規表現は書くことは可能でしょうか? 1) aaaa 2) ajjj 3) kaoa 4) jjjj 5) axxxx

  • 正規表現

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

  • 正規表現の初心者です

    正規表現初心者です。 なぜ、 [0-9]+ という正規表現が下記の112にあたらないのでしょうか? 0-9(数字)の一文字以上の繰り返しなので、複数桁の数字にマッチすると思ったのですが・・。 echo 112|grep -e "[0-9]+" > (マッチせず)

  • 正規表現について

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

  • grepにマッチした正規表現の文字列を取得したい

    grepにマッチした正規表現の文字列を取得し、マッチした文字列を 一覧で取得したいのですが、方法がわかりません。 ※例 grep [0-9][0-9][0-9][0-9][0-9] 検索ファイル名 > 出力ファイル名 不明点あればお知らせください。 よろしくお願いします。

  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • 正規表現を使った文字列の抽出方法について

    正規表現を使った文字列の抽出方法について RHELを使っています。 テキストデータの中に、以下のようなデータが 百万行単位で並んでいます。(カンマ区切り、2列構成) 1, 1.24425 2, 3.25252 (中略) 13, 6.25365 14, 8,36222 (中略) 103633, 252525.0 最終的にやりたいことは2列目のデータのみの抽出です。 考え方として、正規表現で 「<任意の文字列の連続><カンマ>」という文字列を認識させ、 それを「空欄」で置換したいと考えています。 文字列の最後の文字をマッチさせる指定子が「$」という情報をWebで見つけたので まず、grepで見つけられるか以下のようにやってみたのですが、 grep -i ",$" test.txt $が環境変数と取られ、構文エラーとなってしまいます。 使い方がおかしいのでしょうか? ちなみに、うすうす感じている疑問として、「$」は文末にくるものしかマッチしなかったり しますでしょうか? カンマ区切りなので、表計算ソフトを使えなくもないですが、 行数がExcel2007の限界をよく超えるので、それ以外の方法で考えています。 アドバイスよろしくお願いいたします。

  • 秀丸の正規表現(HMJRE.DLL V1.92)で、

    秀丸の正規表現(HMJRE.DLL V1.92)で、 以下のことが可能かどうか教えてください。 ある2つの文字列のいずれも含まない行を 正規表現とGREPで抽出したいのです。 (ほかの手段でもかまいません) たとえば AAAA ABCDEF BCDEFG EFGHI といったテキストデータがあった場合 "ABC"と"DEF"のいずれも含まない行であれば AAAA EFGHI を抽出したいのです。 以上、よろしくお願いします。

  • 正規表現。行頭が○○以外にマッチさせたい。

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

  • 正規表現について

    以下のようなファイル名にマッチする正規表現は [ファイル名] 20080303_001test.txt 20080303_002test.txt [正規表現] ^20080303_(001|002)test\.txt$ であってますでしょうか。 ※特に()内の、"001"と"002)test\.txt"のどちらかにマッチすれば良いという条件になってないか心配です。 よろしくお願いします。

    • ベストアンサー
    • PHP