少し前のトピックの数値かどうかを判別するパターンマッチングの表現に
/^-?\d+\.?\d*$/
とあるかと思います。私なりにどうやったらこの正規表現が解読できるか、やってみているのですが、私の本(独習PERL)で正規表現の部分を調べると\dに関しては[0-9]と同じと出ているのですが、その他の文字(^-?、+\.?、*$)などについては載っておらず、どこで切るのかさえわかりません。
皆さんはどんな本を使って調べているのでしょうか?
また、私の調べ方が悪いのでしょうか?
(たとえば、-だけ調べるとマイナスと出てきちゃいますが、この場合は違い増すよねぇ?)
アドバイスお待ちしています。
No.1ベストアンサー
- 回答日時:
正規表現を理解するには, まず次のメタ文字 (文字そのものではなくて特別な意味を持っている文字) を理解しておくのがよいと思います:
^ 先頭
$ 末尾
* (直前のものが) 0個以上ある (ないかもしれない)
+ (直前のものが) 1個以上ある
? (直前のものが) あるかもしれない (ないかもしれない)
. 任意の文字 (改行を除く)
[] 中の文字のどれか 1個 (- が途中にあるときはその範囲)
[^] 中にない文字
\ 直後のメタ文字の特別な意味を消して普通の文字とする
これくらいはだいたいどのプログラムでも同じように使われるので, 別のプログラムで使われる正規表現でもおよそ理解できるようになります. あとはプログラムによって異なるので個別に覚えることになります. perl の場合は \ のあとに英数字を入れると特別な意味を持ち (例: \d は [0-9]), 逆に \ のあとに英数字以外の文字が入ると必ずその文字そのもの (\. は ピリオドそのもの) という意味になります.
で ^-?\d+\.?\d*$ を解釈すると
^ 先頭に
- ハイフン (マイナス) が
? あるかもしれなくって
\d 数字 (0-9) が
+ 1個以上あって
\. ピリオド (小数点) が
? あるかもしれなくって
\d 数字が
* 0個以上あって
$ 最後
となります.
ありがとうございます。とてもわかりやすかったです。
ひとつ疑問に思ったのですが、
^-?\d+\.?\d*$ って(2.)などの最後にピリオド(小数点)があるものももしかしたらとおるのかなぁと思ったのですがいかがでしょうか?
ピリオドがあるかもしれなくって(実際あって)、数字が0個以上ということはない場合、というのは、起こりにくいとは思うのですが、ありえませんか?
No.4
- 回答日時:
あ, 多くのプログラム言語ではピリオドの前か後ろに数字があれば数値と解釈します.
例えば 0.5 でも .5 でも同じ値と解釈しますし, 2.0 と 2. も同じとみなすはずです.
むしろ, 「ピリオドの前と後ろのどちらにも必要」というのが少数派だったような.
No.3
- 回答日時:
^-?\d+\.?\d*$ だと "2." にはマッチしますが ".2" にはマッチしません (ピリオドの前には数字が必要だから). かといって ^-?\d*\.?\d*$ としてしまうと今度は "-." なんてのもマッチしちゃいます.
でどうするかというと, | というまた別のメタ文字を使います. これは (その前後にある正規表現の) 少なくとも一方にマッチするという意味になります. 多くの場合, グルーピングの ( ) と組合せて (|) という形になります. 今の場合, 「ピリオドの前に 1個以上数字がある」か「ピリオドの後ろに 1個以上数字がある」という条件なので ^-?(\d+\.?\d*|\d*\.?\d+)$ となりますが, これは実は ^-?(\d+\.?\d*|\.\d+)$ と同じになります.
なお, この | や ( ) はプログラムによっては \| とか \( \) という形のこともあります. が, perl では「\ 記号」という形のメタ文字は存在しません. ちょっと覚えやすいかも.
なるほどぉ。要は後ろから見て同じ桁数(桁数という表現は変なのかな?)までをスイッチするような形になるのですね。ほんとにわかりやすかったです。ありがとうございました。
あと、2.について、これって数値として認識してくれないのではないか、と思って下記のような質問をしたのですが、VBではCInt(2.)でエラーにならなかったのでPERLでも大丈夫ってことですよね。失礼しました。
No.2
- 回答日時:
おはようございます。
/^-?\d+\.?\d*$の回で最初のほうに恥ずかしながら間違った答えで解答した者です。
私の場合は、「ソフトバンクパブリッシング・結城浩著・Perl言語プログラミングレッスン入門編」で勉強してます。
今回使用した正規表現(\dや\.や?等全部)も解説されています。\3200もするのでちょっと高いですが重宝してます。
参考URL:http://www.sbpnet.jp/books/products/detail.asp?s …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現 \\b123bと^123$は同じ?
-
逆スラッシュを使わずにメタ文...
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
カンマ区切りの数字をCSVフ...
-
英数字のみ全角から半角に変換
-
EXCELからCSVにすると余計なカ...
-
CString から LPCTSTRの型に変換
-
住宅にカナを入力する際に丁目...
-
何故、日本は未だに数字を3桁...
-
WORDで改ページすると時々グレ...
-
「何とかで始まり、何とかで終...
-
Excel VBAでPDFファイルをMicro...
-
正規表現で、特定の文字列を含...
-
文字コードの%E3%80%とは何です...
-
CSVの定義
-
C#で、テキストボックスの入力...
-
VBA 置換文字がみつからない時
-
メモ帳の段落の揃え方
-
csvデータのダブルクォーテーシ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
これは大きなお世話ですよね? ...
-
マッチングアプリで一言メッセ...
-
正規表現
-
なんで真面目な出会いを求める...
-
マッチ箱(マッチ棒の入った箱)...
-
金額にマッチする正規表現について
-
シェルスクリプト [[ $number =...
-
条件にマッチした行数のカウント
-
リナックスの grepコマンド ...
-
perlで記号除去を行いたいので...
-
正規表現 URL抽出「 [\\/\\b]{0...
-
UNIXコマンドのパターンマッチ...
-
正規表現
-
Tinderのマッチングアプリ辞め...
-
pythonの正規表現、全角カタカ...
-
正規表現について VB6
-
正規表現 .+? について
-
日本語環境下でのバックスラッ...
-
Perl 正規表現に関して
-
配列内の要素をパターンマッチする
おすすめ情報