2011年6月4日土曜日

自問自答の正規表現をダラダラと

以前、あかつきさんが
【InDesign CS4/5】任意の区切り文字を指定してスタイルを変更する
を上げてまして、後で自分でやってみようと思いつつ今日まで。。。

チラッと見た後、自分なりに四苦八苦しようと思い
InDesign:1,1.5,2,CS,CS2,CS3,CS4,CS5
Illustrator:8,9,10,CS,CS,CS3,CS4,CS5
Photoshop:7,CS2,CS,CS3,CS4,CS5
Acrobat:4,5,6,7,8,9
アプリ名は行頭から『:』まで。行頭はキャロット『^』。文字の連続は『.*』。
で、この文字の連続がどこまでつながるかは『.*』の後に:コロンを入れればよいから
『^.*:』が正解なのでは?とサクラエディタでやってみた。ここまでは基本中の基本。


んっ? 違う。。。コロンの前までだった。となるとあの高度な「先読み」とか「後読み」の出番になってくる。calcedonyさんの
正規表現の先読みと後読みはどっちがどっちだかわかりにくいんだよ!(追記あり)
にあるように後読みがマッチパターンより前、先読みがマッチパターンより後なので混乱します^^
で、先読みの肯定は(?=)、否定は(?!)をパクります。『^.*(?=:)』が正解かな?


OK!と思ったが行中に複数のコロンがあると、そこまでマッチしてしまう。
最短マッチはアスタリスクの後、?を入れるんでしたね。
^.*?(?=:)』でOKでした^^ 嫌らしい書き方として否定の否定があります。
『^.*?(?![^:])』はコロン以外の文字でマッチさせない(コロンでマッチさせる)先読みです。 ちなみにパーレンはグループ化、ブラケットは指定した文字のどれかの意。ブラケット内のキャロットは除外の意。


さて次、バージョン名は: , で挟まれるか行の最後にあります。
これは先読み、後読みの両方を使うしかないよなぁ~。
後読みの肯定は(?<=)、否定は(?<!)なので、肯定のみ使用して作ってみた。
『(?<=[:,]).+?(?=[,$])』


行末にあるバージョンにマッチしません。。。ならば行末の$の替わりに改行を使えば、、、と思ったのですが、MacとWinでは改行コードが違うんでした。正規表現の概要に\sなら空白文字(スペース、タブ、改行)にマッチしますありますので『(?<=[:,]).+?(?=[,\s])』行けそう。。。エラーでダメでした。しかし\sで検索すると


改行にマッチしてますので書き方が悪いのでしょう。で『[^,]』で検索すると



改行文字も含まれてますので、何とかなるんでないかい^^
後読みだけにして『(?<=[:,])[^,]*』だとOK


正解を見ます。

アチキあかつきさんせうぞーさん
アプリ名^.*?(?=:).+?(?=:)^[^:]+
バージョン(?<=[:,])[^,]*(?<=,|:).+?(?=,|\r)(?<=[:,])[^,]+

結果は同じでも書き方が三者三様で面白い^^ 後で読み解きましょう。で、初心者は+を使わずに*(アスタリスク)を使うのですね(^^:A

テーブルタグ作成ツールを使って表組みを作成しました^^

2 件のコメント:

  1. パーレン内にパイプは使えるのね^^
    http://goo.gl/K5FKQ

    (?<=[:,]).+?(?=,|$)や(?<=[:,]).+?(?=,|\s)でOKだった。

    返信削除
  2. せうぞーさんの ^[^:]+ は勉強になるなぁ~

    先頭からコロン以外の数文字をマッチか。

    返信削除