ブログトップ 記事一覧 ログイン 無料ブログ開設

あと味 このページをアンテナに追加 RSSフィード Twitter

2008-09-21 制作会社で働く人向け「はじめての正規表現」

制作会社で働く人向け「はじめての正規表現」

制作会社で働いてると、ディレクターライターであればライティング作業をすることがあるし、マークアップエンジニアであればHTMLCSSを処理するし、プログラマーであればコードを書きます。

制作会社に勤めていれば全員何らかの形で、文字列を扱うことになります。

そんな時に正規表現という超強力な文字列処理のテクニックを身につければ、今以上に作業がはかどるし、いろんな問題が解決するのかなーと思い、先週1時間弱の勉強会を開催しました。

プログラマーは普段から使ってるんですけど、なかなか他の部門の人に紹介する機会がないのが現状だったので、多少なり役立ったんじゃないかと思ってます。

せっかくなので、その勉強会で使ったスライド動画にしてニコニコ動画にアップしたので、ご紹介します。*1

D

ついでにウェブページ形式にもしてみました。

はじめての正規表現

って中の人が言ってました。

追記:

Twitterフォロワーさんが間違いを指摘してくれました。

表記ゆれを統一したい」という事例で、「(見積もり|見積)」を「見積り」に置換するとありますが、これだと「見積り」が「見積りり」になって、「見積った」が「見積りった」になってしまいます。

まだ適当な表現は「(見積もり|見積[^り])」です。*2これでもうまくいかないパターンもあるので、今回の対象者の方にはそぐわないかもしれません。

というか完璧にするにはどうしたらいいんだろう?にわか者の俺にはわかりかねるorz...

誰か教えてくれる人がいたら、コメントいただけると助かります。

送り仮名表記ゆれは複雑なので、「(ウェブ|ウエブ)」を「Web」に統一するみたいな単語の置換に使ってください。ご迷惑をおかけしました。

exampleもexsampleに、アスタリスクもアスタリクスにtypoしてるしorz...

Webページ版は今後も参照される可能性があるので、typo表記ゆれの部分は修正しました。

ニコ動は一度アップしたものを直すのは大変なので、ごめんなさい。そのままです。

いろいろご指摘くださった方。本当にありがとうございます。

って中の人が言ってました。

追記2

ちなみに正規表現を試したいって人は以下のサイトが便利です。尊敬するプログラマさんに教えてもらいました。

PHP正規表現チェッカー

追記3

id:sleepwlkさんがとっても素晴らしい正規表現のまとめを書いてくださっています。

正規表現の機能の覚書き

はじめての正規表現勉強してみようというキッカケができた方はここでぜひお勉強してみてください。

自分も勉強します!

*1動画中の漫画は、はてセを使ってます

*2:[^x]はxという文字を除くという意味

cocoatomococoatomo 2008/09/22 09:36 「表記揺れを統一したい」の「見積り」の例ですが、「置換すべきかどうか?」という判定は文の意味を考えなくては判定できません。無茶な例ですが、「バナナの出荷見積もりんごの出荷見積も資料に添付しておきました。」という文の場合は、「/見積も/りんごの/」と文節を区切らなくてはいけませんが、これは(日本語の)構文解析を行わなくてはならず、正規表現だけでやるのは無茶です。(日本語の単語辞書やバックトラックを使った構文解析が必要になるからです。)

その判定を文字情報のみで機械的に行うよりも、人間の目でチェックすべきなのではないでしょうか?
例えば、
・「見積」という文字が現れる行をまるごとどこかに表示させる。
・テキストエディタの「置換して検索」機能を使う。
などの方法を使えば、作業は若干楽になります。

jdgjdg 2008/09/22 09:42 見積もりに関しては無茶だったと反省しています。
日本語の表現は難しいですね。。。

ご提案の
> ・「見積」という文字が現れる行をまるごとどこかに表示させる。
> ・テキストエディタの「置換して検索」機能を使う。

このように人間の目で確認する必要がありますね。
ご指摘ありがとうございました!

Masa03Masa03 2008/09/22 12:54 (見積もり|見積[^り]) ですが、見積(?:もり|(?!り)) にすれば [^り] の一文字が消えずに済みます。

秀丸エディタのヘルプでは「後方不一致指定 」と呼ばれている機能ですね。
一般的には「否定先読みとも呼ばれます。

> 人間の目で
あくまでも私個人の場合ですが、私は一括置換してから人間の目で確かめるようにしてます。
誤爆率の低い表現と判断できれば、効率がいいことが多いです。
鶏が先か...かもしれませんが。

shijimashijima 2008/09/22 13:13 秀丸のことは分かりませんが――。
野暮かも知れませんが、わたしなりのやり方でやってみました。

○行頭の不要な空白を除去したい
検索【 $】
置換【】

→検索【$s+$】

“$s”で空白文字(半角スペースやタブ文字など)。
改行もマッチしてしまうようなら【^[¥t ]+】。

○インデントをリセット
検索【^( | |¥t)*】
置換【】

→検索【^[¥s ]+】

“[abc]”で“(a|b|c)”と等価。括弧を多用せずに済みます。
¥sが改行もマッチするなら【^[¥t  ]+】。

○空要素のスラッシュ追加
検索【(<(meta|link|br|img|hr|textarea|input).*?)>】
置換【¥1 />】

→検索【<(meta|link|br|img|hr|textarea|input)([^>]+)(/ )?>】
→置換【<¥1¥2 />】

“/ ”が最初からついているケースも考慮。
最短マッチしなくても[^x]+でxを除外。

○相対パスを絶対パスに
検索【(<a href=”)(.*?”>)】
置換【¥1http://www.exsample.com/¥2】

→検索【(<a href=”)([^:”]+)”】
→置換【¥1http://www.exsample.com/¥2”】

“:”が含まれない場合に相対パスと判断してみました。
もちろんリンク元がトップレベルにあるとき限定ですね。

以上、習作ということで、ご勘弁。

jdgjdg 2008/09/22 13:17 > Masa03さん
見積(?:もり|(?!り))
おースゴイ!ありがとうございます!
ここまでいくと自分でもよくわかんなくなっちゃいますね。。。
今回の「はじめての正規表現」の対象者には言っちゃいけなかったな〜。

> あくまでも私個人の場合ですが、私は一括置換してから人間の目で確かめるようにしてます。
> 誤爆率の低い表現と判断できれば、効率がいいことが多いです。

ケースバイケースなんでしょうね。
経験談からいくと、範囲選択してから一括置換するとか、あらかじめ影響範囲を絞ってから実行することが多いかもです。

jdgjdg 2008/09/22 13:22 > shijimaさん
¥sは考えもしなかったです!便利ですね。
秀丸では使えないっぽいです。

いろいろなケースを考えるとこれだけでは済まなくて、shijimaさんの教えてくださった正規表現が必要になると思います。

正規表現は複雑になると見向きもしたくなくなるので、今回はそういった複雑なパターンは前提からすべて除外しちゃいました。

こうやってコメントで補完していただくと中級者のためにもなってありがたいです!
自分には紹介できないし。

Masa03Masa03 2008/09/23 12:58 >shijimaさん
> →検索【<(meta|link|br|img|hr|textarea|input)([^>]+)(/ )?>】
> →置換【<¥1¥2 />】
えっと、多分タイプミスだと思いますが、この正規表現はちょっとおかしいです。

1.
にマッチしない
2. <meta test /> が <meta test / /> に置換されてしまう

1. [^>]+ を [^>]* に修正すればOKです。
2. は (/ )? を ( /)? に修正すればいいように思えるかもしれませんが、それでも期待通りに動きません。

検索: <(meta|link|br|img|hr|textarea|input)([^>]*)( />|>)?>
置換: <¥1¥2 />

これでも 1. の不具合は残ります。
(/ )? の動作は「”/ ” がある場合」を検索して、マッチしなかったら「”/ ” がない場合」を検索する、です。
ですので、「”/ ” がない場合」にマッチしてしまっています。
これを回避するためには次のように書きます。

検索: <(meta|link|br|img|hr|textarea|input)(?![^>]*/>)[^>]*(?=>)
置換: ¥0 /

(?![^>]*/>) で「”/ ” がある場合」を除外しているので、「”/ ” がない場合」に確実にマッチできます。

>jdgさん
ごめんなさい。秀丸エディタは (?:pattern) を使えませんでした。
なので、見積(?:もり|(?!り)) は 見積(もり|(?!り)) に直せば秀丸エディタで動作します。
失礼しました。

Masa03Masa03 2008/09/23 12:59 前投稿を修正。
ここHTMLタグを使えるんですね。


NG:1.
にマッチしない

OK: 1. <br> にマッチしない

jdgjdg 2008/09/24 09:04 Masa03さんありがとうございます!
自分ではまだわからないことなので、助かります。

disabledisable 2008/09/24 12:00 正規表現とは全然関係ないのですが、textarea は空要素にはならないかと思います。

jdgjdg 2008/09/24 12:47 > disableさん
本当ですね。。。
帰宅後直します。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証