むらじゅん風呂具

ITエンジニアとたまに歌手と司会などで活動する村中淳のブログ

エディタで学ぶ正規表現入門 備忘録

ひと通り実施したのでメモ書き。

https://dotinstall.com/lessons/basic_regexp_v2

正規表現: 文字列の検索パターン

  • 言語やツールで若干の文法の違いがあり

正規表現の文字

検索時に文字そのものを使うこと。メタ文字を使うことで高度な検索パターンを作ることができる

メタ文字

  • 「.」 → 改行を除く任意の1文字を示す

bat cat hat

→".at"とすることで左の単語が出る

This is a pen.

→"."で検索するとすべての文字が出てしまう

"."とすることでリテラル文字(最後のピリオド)だけ検索が可能

→これを エスケープする と呼ぶ

文字種の限定

  • [\d] 数字の0-9を表す
  • [\D] \d以外
  • [\w] a-z、A-Z、0−9、_
  • [\W] \w以外
  • [\s] スペース、タブ、改行など
  • [\S] \s以外 ※大文字は否定形となる

使ってみる

seki, 03-3001-1256
hidaka, 03-3015-3222
hayashi, 03-3017-7889
検索 \d\d-\d\d\d\d-\d\d\d\d
置換 XX-XXXX-XXXX

結果

seki, XX-XXXX-XXXX
hidaka, XX-XXXX-XXXX
hayashi, XX-XXXX-XXXX

hから始まり7文字の名前を伏せ字にする

検索 h\w\w\w\w\w\w
置換 h******

結果

seki, XX-XXXX-XXXX
hidaka, XX-XXXX-XXXX
h******, XX-XXXX-XXXX

量指定子

直前文字の繰り返しを指定

  • {n} n個
  • {min,max} min以上、max以下
  • {min,} min以上まで繰り返し

電話番号の検索は以下になる

検索 \d{2}-\d{4}-\d{4}

携帯番号にもマッチさせる

検索 \d{2,3}-\d{4}-\d{4}

5文字以上の名前をマッチさせる

検索 \w{5,}
  • ? {0,1}という意味
  • + {1,}という意味
  • * {0,}という意味

例 電話番号のハイフン有無両方にマッチさせる

03-3001-1256
0330011256
検索 \d{2}-?\d{4}-?\d{4}

例 文字が入っている場合

TEL03-3001-1256
T0330011256
検索 \w+\d{2}-?\d{4}-?\d{4}

例 すべてのパターンにマッチさせる

03-3001-1256
0330011256
TEL03-3001-1256
T0330011256
検索 \w*\d{2}-?\d{4}-?\d{4}

量指定子の注意点

例 ダブルクォーテーションで囲った文字を検索する

"apple", "apples", "pineapple"

".+" だと最初から最後まで選択された状態になる為、 ? を付ける

検索 ".+?"

位置を指定する アンカー

例 前の通し番号をマッチさせたい

1 taguchi 6
2 fkouji 9
3 seki 8
4 sekiya 7

\d だと末尾の数字もマッチしてしまう 行の先頭を意味する^(キャレット、ハットと読む)を使う

検索 ^\d

例 行の末尾をマッチさせる場合 行の末尾を意味する$(ダラー)を使う

検索 \d$

例 単語のsekiをマッチさせる(sekiyaをマッチさせない)

検索 \bseki\b

選択子というメタ文字

  • abc|123

abc or 124 を選択する

例 以下の2つともマッチさせたい

example.com
example.net
検索 example\.com|example\.net
※これでも可能 example\.(com|net)

文字クラス

以下全てにマッチさせる

bat cat hat
検索 bat|cat|hat
※以下でも可能
(b|c|h)at
[bch]at

大括弧で囲ったものを文字クラスと呼ぶ

  • [abc] a、b、c、の1文字を指す

例 cat 以外にマッチさせる

bat cat hat

[bh]at とすればいいが、単語が増えた場合にマッチしなくなる為 否定を表す ^ を使う

検索 [^c]at

否定の文字を追加する場合は追記する

検索 [^cb]at
  • ^ →[の直後のみ、否定を表す

例 AからFで始まるものを検索したい

A1
Q31
N18
C5
E32
L4
検索 [A-F]\d
※AからFまでの範囲指定
★文字コード表で文字の並びを意識する必要あり

例 番号の区切り記号が異なる場合

03^3015^3222
03-3015-3222
03.3015.3222

^\d{2}[^-.]

→これだと[^が否定を表すので、-か.以外を検索する

リテラル使用で ^\d{2}[^-.] とするも、^-.までという範囲指定でエラーが出る

→^\d{2}[^-.] とすればマッチ可能

. に関してはエスケープ(バックスラッシュをつけなくても)しなくても リテラルとして解釈される

^ は大括弧の後でなければリテラルとして解釈される

最終的な正規表現

^\d{2}[-.^]\d{4}[-.^]\d{4}$

改行とタブ

  • \t タブ
  • \r\n 改行(windows)
  • \r 改行(v9までのmacos)
  • \n 改行(unix、v10以降のmac)
  • \r\n|\r|\n 改行(すべてに対応)

例 空の改行を処理

abc

a
bb
cc


cc
検索 \n+
置換 \n

結果

abc
a
bb
cc
cc

キャプチャ

例 以下のhtmlリンクタグを作る

dotinstall, https://dotinstall.com
google,https://google.com
example, https://example.com

サイトとURLを記憶して置換する際に利用する

検索 .+,\s?.+

記憶する部分を囲う

検索 (.+),\s?(.+)

()で囲った部分は$1、$2で使うことが可能

置換 <a href="$2">$1</a>

結果

<a href="https://dotinstall.com">dotinstall</a>
<a href="https://google.com">google</a>
<a href="https://example.com">example</a>

後方参照

同じ数字が続いた際にマッチさせる

3, 8, 5, 4, 4, 5, 4, 1, 1, 5, 3, 3

検索 (\d),\s\1

覚えさせた値を1にして使う
→後方参照と呼ぶ