目次
正規表現とは
なぞなぞのような要求を実現できる
文字列の先頭から、半角スペースが0個以上任意の個数続き、 「'」の後にも任意の文字が0個以上任意の個数続く行、 または、改行のみの行を削除したい。
上に記載した例では、ソースからコメント行と空行を削り、実行ステップのみを残したいという要求の例ですが、正規表現と置換を併用する事により簡単に実現することができる。
サクラエディタによる正規表現の例。
^( *'.*)*\r\n
基礎知識
メタキャラクタとリテラル
メタキャラクタ(meta character)とは、正規表現中で特別な意味を持つ文字のことである。リテラル(literal)は通常の文字のことである。
メタキャラクタ | .*+-?^$\|()[]{} など | 特別な意味を持つ文字 |
---|---|---|
リテラル | 平成 年 http など | 通常の文字 |
〃 | \. \* \+ \? \^ \$ \\ \| \( \) \[ \] \{ \} など | 通常の文字(エスケープが必要) |
以下の例をメタキャラクタとリテラルに分けると、「[」「-」「]」はメタキャラクタで、「平」「成」「1」「9」「年」はリテラルとなる。
平成 [1-9]年
文字クラス【[]】
文字クラスとは、複数の文字を「[」と「]」のメタキャラクタで囲んだもののことで、複数の文字の1文字とマッチする。動作はSQLなどのLIKE文とほぼ同じである。
正規表現 | 意味 | マッチする文字列 |
---|---|---|
[0-9] | 半角数字にマッチ | 0 1 2 3 4 5 6 7 8 9 の何れか1文字にマッチ |
[a-z] | 半角英字(小文字)にマッチ | a b c 〜 z の何れか1文字にマッチ |
[A-Z] | 半角英字(大文字)にマッチ | A B C 〜 Z の何れか1文字にマッチ |
[a-zA-Z0-9] | 半角英数字にマッチ | a b 〜 z A B 〜 Z 0 1 〜 9 の何れか1文字にマッチ |
[c-e] | c 〜 e の範囲にマッチ | c d e の何れか1文字にマッチ |
[-c] | -(ハイフン) と c にマッチ | - c の何れか1文字にマッチ |
[a-] | a と -(ハイフン) にマッチ | a - の何れか1文字にマッチ |
[z-a] … × | zの文字コード > aの文字コードとなる為、エラー。 |
否定文字クラス【[^]】
否定文字クラスとは、文字クラスのメタキャラクタ「[」と「]」の中の先頭に「^」を付加したもので、囲んだ文字とは違う1文字とマッチする。
正規表現 | 意味 | マッチする文字列 |
---|---|---|
[^0-9] | 数字以外にマッチ | a b c A B C # @ などの数字以外の1文字にマッチ |
[^a-zA-Z0-9] | 英数字以外にマッチ | # @ ( などの英数字以外の1文字にマッチ |
abc[^0-9] | abcに続く文字が数字以外にマッチ | abcd abcX 5abcZ など(*1) |
*1 abc5 abc 2abcにはマッチしない。
文字クラスの略記法
文字クラスには、以下の略記法が存在する。(全角もマッチするので注意!!)
略記 | 意味 |
---|---|
\d | 半角数字、全角数字、[0-90-9]と同じ |
\D | \d以外、[^0-9]と同じ |
\w | 半角英数字、全角英数字、[a-zA-Z0-9_a-zA-Z0-9_]と同じ |
\W | \w以外、[^a-zA-Z0-9_a-zA-Z0-9_]と同じ |
\s | 空白・タブ・改行・復帰・改ページ、[ \t\r\n\f]と同じ |
\S | \s以外、[^ \t\r\n\f]と同じ |
任意の文字【.】
「.」は任意の1文字にマッチするメタキャラクタである。
正規表現 | 意味 | マッチする文字列 |
---|---|---|
a.c | aで始まり任意の1文字がありcで終わる | abc a@c aBcなど |
xl. | xlで始まり任意の1文字で終わる | xls xla xltなど |
選択【|】
「|」は複数の選択肢のいづれかにマッチするメタキャラクタである。
正規表現 | 意味 | マッチする文字列 |
---|---|---|
Private (Function|Sub) | Privateの後にスペースが1つありFunctionまたはSubがある | Private Function、Private Sub |
do.|c.t | doの後に任意の1文字、または、cの後に任意の1文字がありtで終わる | doc dog cat cutなど |
量指定子、範囲指定繰り返し制御【?*+{n}{n,}{m,n}】
量指定子は、その直前にある正規表現で指定された要素が繰り返される事を意味する。
量指定子 | ||
---|---|---|
最長一致 | 最短一致 | 意味 |
? | ?? | 0個または1個 |
* | *? | 0個以上の任意の個数 |
+ | +? | 1個以上の任意の個数 |
{n} | {n}? | n個 |
{n,} | {n,}? | n個以上の任意の個数 |
{m,n} | {m,n}? | m個以上n個以下の任意の個数 |
以下は量指定子の例。
正規表現 | 意味 | マッチする文字列 |
---|---|---|
https? | httpの後にsが0個または1個ある | http httpsなど |
^ *'.* | 先頭からスペースが全く無いか、または、任意の個数あって、'(シングルクオート)の後に任意の文字が全く無いか、または、任意の個数ある | ' コメントなど |
* 「^」は文字クラス([])内では否定文字クラスの意味であるが、正規表現の先頭に置くと「行の先頭」の意味になる。
位置指定子【^$\b\B(?=~)(?!~)(?<=~)(?<!~)】
位置指定子 | 意味 |
---|---|
^ | 行の先頭 |
$ | 行の末尾 |
\b | 単語の境界 |
\B | 単語の境界以外 |
(?=~) | 肯定先読み |
(?!~) | 否定先読み |
(?<=~) | 肯定戻り読み |
(?<!~) | 否定戻り読み |
肯定先読み【(?=~)】
正規表現 | 説明 |
---|---|
.+(?=ねこ) | 右側に「ねこ」が存在する |
くろねこ
ねこパンチ
まねきねこ
否定先読み【(?!~)】
正規表現 | 説明 |
---|---|
ねこ(?!ミミ) | 右側に「ミミ」が存在しない |
ねこパンチ
ねこミミ
ねこじゃらし
肯定戻り読み【(?<=~)】
正規表現 | 説明 |
---|---|
(?<=ねこ).+ | 左側に「ねこ」が存在する |
ねこパンチ
ねこミミ
ねこじゃらし
否定戻り読み【(?<!~)】
正規表現 | 説明 |
---|---|
(?<!くろ)ねこ | 左側に「くろ」が存在しない |
くろねこ
とらねこ
しろねこ
後方参照【() \1 \2 ...】
後方参照は()でマッチする文字列を保存しておき、それ以降の正規表現で \1 を使用して後方で参照することができる。
2011年12月のアクセスログを選択する例。
正規表現 | 説明 |
---|---|
(201112)\d{2}-\1\d{2}.+ | 201112 のあとに数字が2個続いて、-(ハイフン)のあとにまた 201112 があって、数字が2個続いて任意の文字が1個以上続く |
20111201-20111207_access_log
20111208-20111214_access_log
20111215-20111221_access_log
20120101-20120131_access_log
20120201-20120229_access_log
20120301-20120331_access_log
置換
応用編
0001/01/01~9999/12/31の日付に一致
(0{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})/(0[1-9]|1[0-2])/(0[1-9]|[12]\d|3[01])
00:00:00~23:59:59の時間に一致
([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)
全角文字に一致
[^ -~。-゚]
文字列を含まない行に一致
^((?!含まない文字列).)*$