2012年1月18日水曜日

どこで道を間違えたのか

整数の後にドット0を付加する課題にtwitterを通して多くの方からアドバイスをいただきました。javascriptの方に移ろうかと思ったのですが、ほとんど忘れてしまったし、何より正規表現をろくに理解しないまま次の段階に行っても根本的な問題解決になりませんので、もう少し引っ張ります。アチキと同程度の初心者には参考になると思いますし、正規表現を教える立場にいる方は初心者がどこで間違えるのかを知っていただければ幸いです。

\dは全角数字も対象となることを知りました。んで、半角数字のみを想定しますんで引用するものは[0-9]に変えさせていただきます。

♪途中経過を報告すればいろんなことがありまして、私にすれば一大事、私にすれば精一杯、私にすれば画期的、とても明日が楽しみで、いろんな事がありそうで、いろんな人に会えそうで~(古いけど新しい名曲です^^)

きっかけは正規表現の復習 2にあるようにせうぞーさんのツールで整数と小数点を含んだ数値をマッチはどう書くの?といった超初心者的疑問だったんです。ググって正規表現で数字の桁数を表すに達します。

1. 1桁だけの半角数字をマッチさせる場合は
(?<![0-9,\.])[0-9](?![0-9,\.])

2. 正の整数と小数にマッチする正規表現を参考に
([0-9][0-9]*)(\.[0-9]+)?

1.と2.を合体させて10未満の整数、小数点を含んだ数値がマッチする
(?<![0-9,\.])[0-9](\.[0-9]+)?(?![0-9,\.])

ここまでを検証すると3.の([0-9][0-9]*)(\.[0-9]+)?は、、、([0-9]*)(\.[0-9]+)?でいける。というより([0-9]+)(\.[0-9]+)?だよな。
なぜ([1-9]\d*|0)(\.\d+)?のだろうか? ([1-9]*|0)(\.\d+)?でもいけるのに。。。理解できないままマンマ流用したアチキがアホなだけ。

最初の間違いを再度、書き直すと(?<!\.)(-?[0-9]*)(?![0-9\.])
整数のみをマッチさせようとしたのだが「1月」など後ろに漢字がある数値にもマッチするばかりでなく、小数点以下第2の数値にもマッチしてしまった。うへぇ~(;´Д`)


なんで小数点以下第2の数値にもマッチしてしまうのか調べてるうちに
InDesign者のための正規表現入門にそれらしきヒントが。。。

12/20で終わるはずのキャンペーンがまだやってます。これを例にします。

通信講座1講座+Adobe CS5.5 Design Standard ( Adobe Store 製品版 198,450円 )
キャンペーン価格 64,100円

初心者にありがちな間違ったやり方[\d,]+(?!円)で検索しますと

円の前の数値がマッチしません。
こういった事例にせうぞーさんの温かいお言葉が添えられてます^^

どうしてこうなってしまったのか考えてみてください。




はい、考えさせていただきますm(*T▽T*)m

楽チンな楽曲を選んで楽しく演奏
↑こいつを楽(?=しく)で検索すると「楽しく」の楽にのみマッチ。否定先読みの楽(?!しく)で検索すると「楽チン」と「楽曲」の「楽」にのみマッチ。楽チンな楽曲を選んで楽楽しく演奏にして検証すると理解できます。

わき道にそれずに1. 1桁だけの半角数字をマッチさせる場合をベースに
(?<![0-9\.])[0-9,]+(?![0-9\.])

で良かったんですね(汗 とはいえ勉強になりました。

0 件のコメント:

コメントを投稿