クリップボード履歴管理ソフトのCliborを仕事でもプライベートでも愛用していて、何かを参照しながら文章を書く際には手放せない存在となっている。
クリップボードをストックして管理するだけでなく、定型文機能やFIFO/LIFO、クリップボードを自動で整形する機能など、シンプルながらかなり多機能でアイデア次第でさらに使い方が広がりそう。
わからないことがあったら基本的にはいろいろな機能は開発者様のサイトを参照しているのだけれど、
クリップボードの整形機能の、正規表現を使った置換はいつもよくわからなくなって頻繁に調べまくる羽目に(私が)陥るので、自分用のメモがてら、使い方と変換例をまとめてみた。
正規表現の使い方
perlreref - Perl の正規表現のリファレンス - perldoc.jp
文字
それぞれ一つで1文字を表す。
正規表現 | 種類 |
---|---|
. | 改行を除くすべての文字 |
\d | 数字 |
\w | アルファベット、数字、アンダーバー(_) |
\l | 半角英小文字 |
\u | 半角英大文字 |
\s | 空白文字( スペース「 」、タブ文字「\t」、改行文字「\n, \r」など) |
そして小文字ではなく大文字を使うと、”それ以外”になる。
正規表現 | 種類 |
---|---|
\D | 数字以外 |
\W | アルファベット、数字、アンダーバー(_)以外 |
\L | 半角英小文字以外 |
\U | 半角英大文字以外 |
\S | 空白文字以外 |
文字クラス
数字や半角英子文字などで指定できるが、その中でさらに範囲を絞りたい時もある。
そういうときは[]
を使う。
記述 | 解説 | 例 |
---|---|---|
[ ] | [ ]内のいずれかにマッチ | [abc]→"a"または"b"または"c" |
[-] | ダッシュは範囲を指定する | [a-c]→"a"から"c"の間 すなわち"a"または"b"または"c" [1-3]→"1"から"3"の間 すなわち"1"または"2"または"3" |
[^] | [ ]内の^は”それ以外”にマッチする | [^a-c]→aからc以外 すなわちdからzの間 [^1-3]→1から3の間以外 すなわち0と、4から9の間 |
空白文字
tab、改行などは以下の通り
正規表現 | 種類 |
---|---|
\t | tab文字 |
\n | 改行(Unix系OS) |
\r | 改行(Mac) |
\r\n | 改行(Windows) |
後述の"または"をつかうと、改行は以下の通りで表せる。
\r\n|\n|\r
繰り返し
ここまでの文字はそれぞれ1回で1文字を表す。
つまり複数文字を表すにはそれだけ繰り返せばよい(例:数字3文字→\d\d\d
)のだが、
たくさんずらずらと描くのはめんどくさい&〇文字以上〇文字以下などと幅を持たせることができない。
そんなときに便利なのが以下の記法
表記 | 繰り返し数 |
---|---|
{n} | 直前の文字がn 回 |
{n,m} | 直前の文字がn回以上m 回以内 |
{n,} | 直前の文字がn回以上 |
* | 直前の文字が0回以上 ({0,} と同じ) |
+ | 直前の文字が1回以上 ({1,} と同じ) |
? | 直前の文字が0回または1回 ({0,1} と同じ) |
例えば、
数字3文字→\d{3}
"ggle"のgとgの間にOが2文字以上→go{2,}gle
など
グループ化
グループ化の"()"
置換するにあたって、マッチした文字をそのまま抜き出したいこともある。
そういう時は()
で囲ってあげることでグループ化する。
グループ化したところは先頭から$1,$2,$3...と書けば取得できる。
こんな感じ↓
グループ化したときに使える表現が以下の通り
| は"または"
( )
の間の|
は”左右いずれか”を意味する。
例えば、
(abc|def)
→"abc"または"def"ならばマッチ
n番目のグループにマッチ
\1, \2のように\の後ろに数字を置くことで、その数字番目のグループとマッチするならばマッチするように検索することができる。
例えば、(.{3})\1
の場合、
"abcabc"や"123123"などのように3文字が連続して2回繰り返す場合はマッチ
”abcdef”などのように3文字が連続して繰り返さない場合はマッチしない
エスケープ
\d
や\n
、.
など、正規表現で使われている文字を、普通に検索したい文字として使うためにはエスケープさせなければならない。
\
を前に置くことでエスケープできる。
また、\Q
と\E
で囲っている間の部分は、通常の文字として検索される。
例えば、「愛!夢!../」を検索したい場合、愛!夢!\.\./
でも、愛!夢!\Q../\E
でもよい。
エスケープしないといけない文字の例
正規表現 | 備考 |
---|---|
\ | エスケープ文字そのものであるため |
* | エスケープしなければ直前を0回以上繰り返す |
+ | エスケープしなければ直前を1回以上繰り返す |
. | エスケープしなければ"."に限らずすべての改行以上の文字に対応 |
? | エスケープしなければ直前の文字が0または1回に対応 |
{ } | エスケープしなければ繰り返す数となる |
( ) | エスケープしなければグループ化として使う |
[ ] | エスケープしなければカッコ内のいずれかの文字に一致する場合マッチする |
^ | 行頭指定(Cliborでは使いにくい) |
$ | |
- | [ ]の中に書く場合のみエスケープが必要 |
| | |
/ | \d, \nなど正規表現を指定するときに使う文字である |
整形機能の使用例
ここからは活用例をまとめてみる。
開発者様ページにある例
以下のページに活用例がかなり載っている
日付を抜き出す
ファイル名に日付をyyyymmddやyymmdd形式で入れ込んで保存していると、この日付の部分だけ抜き出したいことがある。そんな時に使える整形テクニック
まず、西暦は4桁の数字であるから、\d{4}
1900年代以降しか使わないなと思ったら、(19|20)\d{2}
下2桁しか使わない場合は2桁の数字なので\d{2}
月は01から12なので、(0[1-9]|1[0-2])
日は01から31までなので(0[1-9]|[1,2][0-9]|3[01])
大の月、小の月を無視したらの話だけど…。
というわけでyyyymmdd形式の日付を表す正規表現は
\d{4}(0[1-9]|1[0-2])(0[1-9]|[1,2][0-9]|3[01])
抜き出すためにグループ化などを適宜入れ、Cliborの置換機能は一致しない部分はそのまま残してしまうので日付のみを抜き出すために.*
を前後に入れてあげると、
.*(\d{4})(0[1-9]|1[0-2])(0[1-9]|[1,2][0-9]|3[01]).*
となり、置換後に
$1$2$3
と入れてやることで、日付を抜け出せる。
-や/、.を区切り文字として使用することも可能で、その場合は
.*(\d{4})([\-\/\.]?)(0[1-9]|1[0-2])([\-\/\.]?)(0[1-9]|[1,2][0-9]|3[01]).* >$1$2$3$4$5
としてもいいし、整形の組み合わせ登録などを活用しても良さそう。
PDFからコピペするとき
PDFからコピペしてきてWordに貼りつけたり、翻訳ソフトに入れたりすることがあるが、そういうときに改行がそのまま残ってしまうことがある。
そんなときは以下の自動整形を作成し、有効にしておくと、改行を勝手に消してくれる。
置換前
(.*)(\r|\n|\r\n)
置換後
$1
英語の場合は$1
の後ろに半角スペースを入れてあげるとなおよし。
さいごに
ほかにもなんかいい使い方を見つければ随時更新予定です。
いい方法があればぜひおしえてくださいませ。