秀丸で正規表現をつかう

らら
らら

はじめに

筆者が初めて正規表現をつかったのは、grep DOS版でファイル検索で使ってましたね。

そこからperlをやった時、プログラムで正規表現が使えたのが、感動した記憶があります。

電話番号、郵便番号、数値チェック、英数字チェックなど書式のチェックでつかえますよね。。

今回は、秀丸での検索、置換について記載していきます。

たぶん、わからない人にとって正規表現は、記号の意味が・・・・とか

基本事項

秀丸とかでは、ちょっと異なる部分があるのでメタ文字等は本家でちゃんと確認しましょう!

基本ベースはあまり変わりはありません。。

基本メタ文字


[ ]	キャラクタクラス(文字クラス)
( )	パターンをグループ化する
^	行頭 (またはキャラクタクラス内での補集合)
$	行末
.	改行を除く任意の1文字
*	直前のパターンの0回以上の繰り返し
+	直前のパターンの1回以上の繰り返し
?	直前のパターンが0回または1回現れる
|	パターンの論理和
\	エスケープ文字 基本メタ文字をに文字として使う場合うエスケープする。例 \(\)など

特殊文字、文字クラス内で使用できるメタ文字


\t	タブ
\r	リターン
\n	改行
\s	空白([ \t\r\n]と同じ)
\S	\s以外
\d	数字([0-9]と同じ)
\D	\d以外
\c	英数字と「_」([a-zA-Z0-9_]と同じ)php perlなどは\w
\C	\c以外 php perlなどは\W
\i	英字と「_」([a-zA-Z_]と同じ) 秀丸のみ
\I	\i以外 秀丸のみ

キャラクタクラス(文字クラス)

[]と-で表現できる

数値のいずれか1文字とマッチ


[0123456789]
[0-9]
\d

英字大文字・小文字のいずれか1文字とマッチ


[a-zA-Z]

英字大文字・小文字・「_」のいずれか1文字とマッチ


[a-zA-Z_]
\c
注意)正規表現で分かりずらいのは、文字クラスで「^」を使用すると、指定したもの以外という表現になるので前方一致と勘違いしやすい・・ この場合、英字大文字・小文字・「_」以外の場合になる

[^a-zA-Z_]

下記になると、英字大文字・小文字・「_」が先頭1文字目とマッチする


^[a-zA-Z_]

下記はマッチ

abc

下記はマッチしません

01abc

上記では、文字のいずれかはじめの1文字がマッチすると終わってしまいます。

これに「+」(直前のパターンの1回以上の繰り返し)を付けるとこで文字列すべてとマッチできます。


[a-zA-Z_]+

英字か数字なんでもの場合「.」(改行を除く任意の1文字)を使います。

「.」(改行を除く任意の1文字)と「+」(直前のパターンの1回以上の繰り返し)


.+

a.+e
とすると

apple ageとマッチしてaeとマッチしません。

aeをマッチさせるには、「*」直前のパターンの0回以上の繰り返しを使います。

「*」は0回以上 「+」1回以上なのです。この0と1の回数以上がみそです。はじめのうちはなんで。。マッチしないの?


a.*e

これでae,apple,ageなどマッチできます。

上記では、マッチするものすべて反映されます。

「+」(直前のパターンの1回以上の繰り返し)と「?」直前のパターンが0回または1回現れる

最短マッチ、一番はじめでマッチして終了します。

ただ、このまま書いてしまうと1行そのままマッチしてしまうので


<tag>(.+?)</tag>

とします。

下記の文字列があった場合


<tag>a</tag><tag>b</tag><tag>c</tag>

下記がマッチされます。


<tag>a</tag>

これは、?を付けない場合全行マッチされます。


<tag>a</tag><tag>b</tag><tag>c</tag>

グループ化について( )で括ります。

これは秀丸で使うと便利です。

秀丸では、検索・置換ウィンドウで正規表現を使用するにチェックする必要があります。


(.+)

例 例えば お客さんから下記のテキストをもらいます。スペースで区切られてテキスト


会社名 TEL 住所
〇〇会社 000-xxx-2222 愛知県○○市
〇×会社 000-xxx-1111 愛知県○○市×××

これはタブでも可能です。スペースを\tにすれば同様です。CSVのカンマは,で。

検索文字


(.+) (.+) (.+)

()で括った箇所がマッチすると秀丸の場合\1 \2 \3の変数にマッチした値が入ります。()数分1から数えて増減させます。

php perlなどでは$1 $2 $3になります。

置換先の記述


<tr>\n<td>\1</td><td>\2</td><td>\2</td>\n</tr>\n

regx03

regx04

また下記のテキストだと


電脳職人村 http://omakase.net
電脳職人村サポート http://ccv.co.jp

検索文字


(.+) (.+)

置換先の記述


<a href="\2">\1</a>

regx01

regx02

どうですか?あ!。これ使える!って・・・なりましたか?

CSVだと


電脳職人村,http://omakase.net,メモ
電脳職人村サポート,http://ccv.co.jp,メモ2

検索文字


(.+),(.+),(.+)

置換先の記述

別に\3とかあっても使わないのであれば記述なしで消えます


<a href="\2">\1</a>

先頭の行番号を削除したい。前方一致

検索文字


^[0-9]+\s

置換先の記述

なし

スペースをタブに

検索文字 スペース4つ


置換先の記述


\t

行の最後に追加したいCSV

$の行末をつかう 後方一致

検索文字


,$

置換先の記述


,追加したいもの

ルート直下のファイルをディレクトリへ一括変換したい。

検索文字


http:\/\/www.omakase.net\/([^\/]+)\.(png|jpg|jpeg|gif|)$

置換先の記述


http://www.omakase.net/newdir/\1.\2

(png|jpg|jpeg|gif|)はグループとパターンの論理和でpng,jpg,jpeg,gifのいずれかって場合に使用する。

初めの1つだけ置換したい。。

はじめの=だけタブに置き換えたい!

item="あいうえお<a href='a.html'>テスト</a><div class='aaaa'>"

検索文字


(^.*?)(=)

置換先の記述


\1\t

これでエクセルとかに読んでしまえば、2つに分割できますね。!

筆者は翻訳とかのやつによく使います・・

さいごに

きちんと、バックアップとってからためしましょう!

では。。。

関連記事