• ベストアンサー

正規表現の勉強方法

少し前のトピックの数値かどうかを判別するパターンマッチングの表現に /^-?\d+\.?\d*$/ とあるかと思います。私なりにどうやったらこの正規表現が解読できるか、やってみているのですが、私の本(独習PERL)で正規表現の部分を調べると\dに関しては[0-9]と同じと出ているのですが、その他の文字(^-?、+\.?、*$)などについては載っておらず、どこで切るのかさえわかりません。 皆さんはどんな本を使って調べているのでしょうか? また、私の調べ方が悪いのでしょうか? (たとえば、-だけ調べるとマイナスと出てきちゃいますが、この場合は違い増すよねぇ?) アドバイスお待ちしています。

  • Perl
  • 回答数4
  • ありがとう数4

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

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

正規表現を理解するには, まず次のメタ文字 (文字そのものではなくて特別な意味を持っている文字) を理解しておくのがよいと思います: ^ 先頭 $ 末尾 * (直前のものが) 0個以上ある (ないかもしれない) + (直前のものが) 1個以上ある ? (直前のものが) あるかもしれない (ないかもしれない) . 任意の文字 (改行を除く) [] 中の文字のどれか 1個 (- が途中にあるときはその範囲) [^] 中にない文字 \ 直後のメタ文字の特別な意味を消して普通の文字とする これくらいはだいたいどのプログラムでも同じように使われるので, 別のプログラムで使われる正規表現でもおよそ理解できるようになります. あとはプログラムによって異なるので個別に覚えることになります. perl の場合は \ のあとに英数字を入れると特別な意味を持ち (例: \d は [0-9]), 逆に \ のあとに英数字以外の文字が入ると必ずその文字そのもの (\. は ピリオドそのもの) という意味になります. で ^-?\d+\.?\d*$ を解釈すると ^ 先頭に - ハイフン (マイナス) が ? あるかもしれなくって \d 数字 (0-9) が + 1個以上あって \. ピリオド (小数点) が ? あるかもしれなくって \d 数字が * 0個以上あって $ 最後 となります.

cshoaucmoa
質問者

お礼

ありがとうございます。とてもわかりやすかったです。 ひとつ疑問に思ったのですが、 ^-?\d+\.?\d*$  って(2.)などの最後にピリオド(小数点)があるものももしかしたらとおるのかなぁと思ったのですがいかがでしょうか? ピリオドがあるかもしれなくって(実際あって)、数字が0個以上ということはない場合、というのは、起こりにくいとは思うのですが、ありえませんか?

その他の回答 (3)

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

あ, 多くのプログラム言語ではピリオドの前か後ろに数字があれば数値と解釈します. 例えば 0.5 でも .5 でも同じ値と解釈しますし, 2.0 と 2. も同じとみなすはずです. むしろ, 「ピリオドの前と後ろのどちらにも必要」というのが少数派だったような.

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

^-?\d+\.?\d*$ だと "2." にはマッチしますが ".2" にはマッチしません (ピリオドの前には数字が必要だから). かといって ^-?\d*\.?\d*$ としてしまうと今度は "-." なんてのもマッチしちゃいます. でどうするかというと, | というまた別のメタ文字を使います. これは (その前後にある正規表現の) 少なくとも一方にマッチするという意味になります. 多くの場合, グルーピングの ( ) と組合せて (|) という形になります. 今の場合, 「ピリオドの前に 1個以上数字がある」か「ピリオドの後ろに 1個以上数字がある」という条件なので ^-?(\d+\.?\d*|\d*\.?\d+)$ となりますが, これは実は ^-?(\d+\.?\d*|\.\d+)$ と同じになります. なお, この | や ( ) はプログラムによっては \| とか \( \) という形のこともあります. が, perl では「\ 記号」という形のメタ文字は存在しません. ちょっと覚えやすいかも.

cshoaucmoa
質問者

お礼

なるほどぉ。要は後ろから見て同じ桁数(桁数という表現は変なのかな?)までをスイッチするような形になるのですね。ほんとにわかりやすかったです。ありがとうございました。 あと、2.について、これって数値として認識してくれないのではないか、と思って下記のような質問をしたのですが、VBではCInt(2.)でエラーにならなかったのでPERLでも大丈夫ってことですよね。失礼しました。

  • omni2
  • ベストアンサー率53% (33/62)
回答No.2

おはようございます。 /^-?\d+\.?\d*$の回で最初のほうに恥ずかしながら間違った答えで解答した者です。 私の場合は、「ソフトバンクパブリッシング・結城浩著・Perl言語プログラミングレッスン入門編」で勉強してます。 今回使用した正規表現(\dや\.や?等全部)も解説されています。\3200もするのでちょっと高いですが重宝してます。

参考URL:
http://www.sbpnet.jp/books/products/detail.asp?sku=4797312211
cshoaucmoa
質問者

お礼

ありがとうございます。リンク先の目次を見ただけでもだいぶ載ってそうというのがわかりました。今度本屋に行ってみます(~~)/

関連するQ&A

  • Perl正規表現わかりますか?

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

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

    例えば 1234# 2345$ 2467# 2579$ 等の4桁の数値の後、#か$がくる文字列があるとして この数値の部分だけを抜き出す正規表現って可能でしょうか? 記号を含めていいなら [\d]{4}[#|\$] な感じになると思うのですが 数値のみ、1234,2345,2467,2579といった感じで選択したいのです。 宜しくお願いします。

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

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

    • ベストアンサー
    • Perl
  • 正規表現でのマッチング

    連想配列%hushがあります。 %hushの中のキーが「a何とか」、つまり a0、a1、a2、a3、・・・ の値だけを、配列@arrayに格納します。 つまり  $array[0]=$hush{'a0'}  $array[1]=$hush{'a1'}  $array[2]=$hush{'a2'}  $array[3]=$hush{'a3'} ・・・ といった感じにしたいのですが、 「a何とか」は正規表現を用いて  a.* と表現できます。 ってここまでは手元の本で分かったのですが、マッチングのif文をどう書けばいいんだよ!  if($key==a.*) と書いてもうまくマッチしてくれないんで、a.*を""で括ってみたり()で括ってみたりするものの相手にされず・・・ 手元の本は「こういう場合正規表現ではこう書けば良くて、これをマッチングさせれば良い」みたいなことを書いていますが、マッチングのさせ方は書いていません。 プログラムの文法書を読むと、条件分岐の仕方は書いていますが、==演算子の右側が正規表現だった場合の使い方は書いていません。 あるいは、正規表現の場合のマッチングはif文などを用いないのでしょうか? だったら正規表現の本にマッチングの文法を書いていますよね!? なんだかんだでマッチングがうまくいかないのです。 この場合、どう記述すればいいのでしょうか? お手数をお掛けします。

  • 正規表現について

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

    • ベストアンサー
    • PHP
  • URL\正規表現@java

    perlメモさん?にPerlでのURLの正規表現はあるのですが Javaで使いたいと思います。 Pattern pattern = Pattern.compile("正規表現"); Matcher matcher = pattern.matcher(String); のステートメントを使う方法をご存知な方おられませんか? Perlメモさん?の正規表現をエディタにコピペしても 不正なエスケープエラー?がでてだめでした。 (http Urlのごちゃごちゃした奴の下から二番目) (「\b(?:」で始まる奴です) なのでエディタに貼り付けて\を\\に置き換えたものを 正規表現の部分にしたところコンパイルはとおりましたが、 正確にマッチしてくれませんでした。 よろしくお願いします。

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

    今lexのプログラムを書いているのですが、正規表現の部分でつまずいてしまいました。perlの正規表現なら分かるのですが、lexと少しかってが違い困っています。lexの正規表現でコメント(プログラム中で/**/で囲まれた部分)を読み飛ばす時には、どのような正規表現にしたら是非教えてください。なお/**/の中には文字列*/は出てこないと過程していいとのことでした。 解答お願い致します。

  • Perl正規表現(置換)

    Perlを用いてテキスト中の文字列 /^\d+$|^\d+\.[05]{1}$/ を、以下の文字列に置換したい場合、 うまくやる方法はないでしょうか? /^[0]+$|^[0]+\.[0]+$/ 正規表現を使いたいですが、 1つ1つエスケープしていくのはさすがに・・・ よろしくお願いいたします。

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

    お世話になります。正規表現の質問です。 \w に当たる文字とハイフンに合致するが、少なくとも一文字はアルファベット(a-z)またはハイフン(-)が含まれていなければならない(つまり、数字だけの文字列は合致しない) という正規表現はどうあらわせばよいでしょうか。 以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現のパターンに変数を指定したい

    perlでパターンマッチを行う際、正規表現で行いますが、パターン文字列内に変数を指定したい場合はどうすればよいのでしょうか? if ($ENV{HTTP_USER_AGENT} =~ /$pattern/) {  : } というようなことをしたいのですが、うまくいきません。 方法はありますでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう