2012年1月19日木曜日

リベンジは無理なのか

迷路に嵌った原因、正の整数と小数にマッチする正規表現へのリベンジ。
0 ... OK
1 ... OK
123 ... OK
0123 ... NG
0.1 ... OK
0.123 ... OK
12.345 ... OK
1. ... NG
hoge ... NG
0755 ... NG
↑こんな感じでマッチさせたいそうだ。要は0始まりの整数と小数点で終わる数値をアンマッチして整数と小数点を含んだ数値にマッチさせたい。
前にも書いたが^([1-9]\d*|0)(\.\d+)?$でマッチするが、太字部分の\dがなくてもマッチする。\dが必要なのは.\d(ドット数値)にマッチさせたくない時だ。

^([1-9]\d*|0)(\.\d+)?$のイヤらしいところは行頭、行末を外した([1-9]\d*|0)(\.\d+)?だとマッチ箇所が変わる。条件を満たす位置にあってもだ。

本文中に出現した上記数値にマッチする正規表現を試行錯誤したが、見つからなかったので一つ一つ整理していく。

初心者は正規表現でどこまで出来て、どこから出来ないのかが分からない。仕事でもそうだが何が出来るかより何が出来ないかを知ることが大事。そうでないと無駄な時間を費やしてしまう。しかし待て、試行錯誤の無駄な時間を経験値と呼ぶだろうか? とはいえ、そんな時間を費やしたくなく、ラクしたくて正規表現、スクリプトを習得しようとしているんですよ。なんか矛盾を抱えてる。。。


0始まりの整数にマッチする正規表現(単独の0はOK)
(?<![\.,0-9])0[0-9]+

正直な話、否定後読みが理解できないままテキトーに弄っていたら出来たので、よく分かってません。

ついでに
整数ドットで終わる数値にマッチする正規表現
[0-9]+\.(?![0-9])

ドット始まり整数で終わる数値にマッチする正規表現
(?<![0-9])\.[0-9]+

否定後読みは頭が混乱します。「(@_@)」?

0 件のコメント:

コメントを投稿