2011年12月10日土曜日

正規表現の復習 2

指定文字のセルにセルスタイルを割り当てるを読んで思い出したのが、せうぞーさんの傑作

正規表現にマッチしたら、指定のセルスタイルを適用する「regex_cellstyle 0.2」

これっ、最初に見たとき「凄げぇツールだな」と感嘆したのですが、いかんせん正規表現が自在に使えないと使いこなせないツールなのです。使用ユーザーを選ぶレベルの高いツールです。そんな理由で(アチキには無理、無理!)とスルーしてきたのですが、最近また「正規表現熱」が復活してきたので、これを機に復習。
YouTubeからスクリーンショットを撮らせていただきました^^

1. マイナス数値のあるセル選択


文章中にあるマイナスを含んだ小数点のある数値を正規表現で選択となると大変なのですが、ここは行頭にマイナスがあるセルを選択するので「^-」だけでOK。以前、勉強したJavaScriptだと

if(cellObj.characters[0].contents=="-"){ です。
characters[0]でセル内文字の先頭を表します。


2. 小数点を含んだ0-5数値のあるセル選択


これは^[0-5]\.と入力されてます。行頭(^)が0~5範囲のどれか([ ])の後に小数点(\.)にマッチ。


3. 小数点を含んだ6-10数値のあるセル選択


これは^([6-9]|10)\.と入力されてます。6~9もしくは10のいずれか(|)の後の小数点にマッチ。


4. 小数点を含んだ2桁数値(16-20)のあるセル選択


これは^(1[6-9]|20)\.と入力されてます。11-15の場合は1[1-5]\.です。後はこれの繰り返しです。

で、文中でマッチさせる正規表現に挑戦してみます。
全国平年値(1971~2000年)・月別最高気温の表をエディタにコピペ。
ググると1~20の数字を表す正規表現は(?<!\d)([1-9]|1[0-9]|20)(?!\d)なのですが、せうぞーさんの正規表現で数字の桁数を表すによりますと
「1.234」とか「1,234」なんていう小数点やカンマがあると「.」「,」の手前が単語境界になるから。残念。切腹(古い...
実際、EMエディタでやってみますと↓になってしまいます。


解決法も記されてました。
ですから、上記のように1桁だけの数字を検索したいなら
(?<![\d,\.])\d(?![\d,\.])
とすればいいでしょう。

で、まず「正規表現 小数点」でググると
正の整数と小数にマッチする正規表現にたどり着く。

([1-9]\d*|0)(\.\d+)?

でやってみると見事にマッチ!↓


これをベースに1-5の小数点を含んだ数値の正規表現をいろいろ弄り、
(?<![\d,\.])[0-9](\.\d+)でいけるかと思ったが、整数にマッチしない↓(マイナスは後でやるのでここでは無視)。


試行錯誤の挙句

(?<![\d,\.])[0-5](\.\d+)?(?![\d,\.])

でゴールに達するε~( ̄、 ̄;)ゞフー. 
? の場合は、直前の文字がまったくないか、1つだけあるという意味だったんだよな。

追記
マイナス数値は、-(?<![\d,\.])[0-5](\.\d+)?(?![\d,\.])
0-5は、(?<![\d,\.-])[0-5](\.\d+)?(?![\d,\.])
6-10は、(?<![\d,\.-])([6-9]|10)(\.\d+)?(?![\d,\.])
16-20は、(?<![\d,\.-])(1[6-9]|20)(\.\d+)?(?![\d,\.])

0 件のコメント:

コメントを投稿