正規表現は、文字列の検索パターンを表現するための記法です。英語では、Regular Expression、Regexと呼ばれたりします。言語やツールにより多少の違いがあります。
正規表現については、ドットインストールで勉強することができます。この記事は、その内容を備忘録的に、メモしています。復習やチートシートのとして、利用いただけたら幸いです。
文字をそのまま検索で使うことをリテラルと言います。
メタ文字を使う
.を使う
メタ文字を使うことで高度の検索をすることができます。.は、改行を除く任意の1文字という意味です。
例えば、bat cat hat jetという文字列があった場合、.atとするとjet以外の文字列が、検索対象となります。
\を使う
This is a pen.の.を検索対象としたい場合、.を使うと全ての文字が検索対象となってしまいます。\(バックスラッシュ)を使って、\.とすると、メタ文字をエスケープすることができ、.をリテラルとして検索対象にすることができます。
\を検索対象にする場合は、\\として、検索します。
文字種
-
\d->0-9 -
\D->\d 以外 -
\w->a-z, A-Z, 0-9, _ -
\W->\w 以外 -
\s->スペース, タブ, 改行など -
\S->\s 以外
数字を置換する
ito, 03-0123-4567
sato, 03-1234-5678
tanaka, 03-9876-5432
上記の電話番号の部分を検索対象にして、xx-xxxx-xxxxで置換したい場合は、
\d\d-\d\d\d\d-\d\d\d\d
xx-xxxx-xxxx
としてあげると、
ito, xx-xxxx-xxxx
sato, xx-xxxx-xxxx
tanaka, xx-xxxx-xxxx
とすることができます。
文字列を置換する
今度は、下記のtanakaのt以外を伏せ字にしてみます。
ito, 03-0123-4567
sato, 03-1234-5678
tanaka, 03-9876-5432
tで始まる6文字の文字列なので、
t\w\w\w\w\w
t*****
とすると、
ito, xx-xxxx-xxxx
sato, xx-xxxx-xxxx
t*****, xx-xxxx-xxxx
と置換する事ができます。
量指定子
量指定子を使うと、\d\d\d...と続くものを省略して書く事ができるので便利です。
{n}を使うと、n個、{min,max}を使うとmin以上、max以下、{min,}は、min以上`という意味で連続するものの数を指定して、書く事ができます。
例えば、下記のような電話番号を指定するには、
03-0123-4567
\d{2}-\d{4}-\d{4}
のように検索する事ができます。
また下記の2つの番号を検索する場合は、
03-0123-4567
090-0123-4567
\d{2,3}-\d{4}-\d{4}
とすると、両方に一致させる事ができます。
このように、量指定子を使うと簡単に書く事ができて便利です。
下記の、名前の4文字以上を検索対象にしたい場合は、
ito, 03-0123-4567
sato, 03-1234-5678
tanaka, 03-9876-5432
\w{4,}
すると、satoとtanakaに一致させる事ができます。
? + *
?は{0,1}、 +は{1,} 、*は{0,}という意味です。もしこの意味がわからなければ、一つ上のセクションの量指定子を見てみてください。
下記の2つの番号に一致させたい場合は、
03-1234-5678
0312345678
\d{2}-?\d{4}-?\d{4}
とするとどちにも一致させることができます。
また下記の2つの番号に一致させたい場合は、
TEL03-1234-5678
T0312345678
\w+\d{2}-?\d{4}-?\d{4}
とするとどちにも一致させることができます。
下記の4つの番号に一致させたい場合は、
03-1234-5678
0312345678
TEL03-1234-5678
T0312345678
\w*\d{2}-?\d{4}-?\d{4}
とすると全てに一致させることができます。
次のような文字列を検索する場合は、
"apple", "apples", "pineapple"
".+?"
とすると一致させることができます。
この場合の?は先に説明した意味とは異なる意味を持っているようです。
アンカー
アンカー配置を指定するのに使います。^は行の先頭、$は行の末尾、\bは単語の境界を意味するメタ文字です。
^は、次のように、行頭の数値に一致させたい場合で、他にも数値がある場合に使えます。
1 sato 6
2 ito 9
3 tanaka 8
4 saito 7
^\d
とすると一致させることができます。
また、
\d$
とすると末尾の数値に一致させることができます。
検索に、itoと入力するとitoとsaitoの一部のitoにも一致してしまいますが、単語としてのitoのみに一致させたい場合は、以下のようにすると単語としてのitoのみに一致させることができます。
\bito\b
選択子
abc|123とするとabcまたは、123という意味になる。
下記の文字列に一致させたい場合、
example.com
example.net
下記の2つの書き方で一致させることができる
example\.com|example\.net
example\.(com|net)
文字クラスを使う
下記の文字列に一致させたい場合、
bat cat hat
下記の2つの書き方で一致させることもできるが、
bat|cat|hat
(b|c|h)at
[]を使って、
[bch]at
としても一致させることができる
[abc]は、a,b,cのどれか1文字という意味になる
^で否定の表現
[の直後で、^を使うと否定の表現になる。
下記の文字列で、cat以外に一致させたい場合
bat cat hat eat
下記のようにすると一致させることができる
[^c]at
また、hatのみに一致させたい場合は、
[^cb]at
としても一致させることができる。
-で範囲指定
例えば[A-F] とするとAからFという意味になる。
下記のリストのAからFに一致させたい場合は、
A1
Q31
N18
C5
E32
L4
下記のようにすると一致させることができる
[A-F]\d+
この範囲指定を使うときは、文字コード表を参考にするといいみたいです。
下記に参考の表を貼っておきます。もしもっといいものがあれば教えてください。
ASCII
文字クラスのルールに慣れる
下記のような電話番号があり、全てに一致させたい場合
03^1234^5678
03-1234-5678
03.1234.5678
^\d{2}[^-.]
としてしまうと、[の直後に^が来てしまっているので、否定の意味になってしまう。\を使って、エスケープすることができるが、
すると、-が範囲を指定するメタ文字として認識されてしまいます。なので、 また\エスケープします。
文字クラス内でのルール
他にもエスケープするものや、順番によってはエスケープしないものなど、状況によっても変わってきます。
[]内では、]もエスケープが必要で、[\]]のように書いてエスケープします。
\も[\\]のようにエスケープします。
上記の[^-.]についてですが、[]内では、.は、リテラルなので、エスケープする必要がありません。また、[-.^]の順番で書いた場合、-は範囲を表さず、^は、[の直後ではないのでエスケープする必要がありません。
最終的に以上のルールを踏まえて、一致させると下記のようになります。
^\d{2}[-.^]\d{4}[-.^]\d{4}[-.^]$
タブと改行
\tでタブを表す。改行は、OSによって異なり、Windowsは\r\n、V9までのmacOSは\r、UinuxとV10以降のmacOSは\nで改行を表す。選択肢を使って\r\n|\r|\nとすると、全てのOSに対応させることができる。
下記の文字列の改行を一つに統一したい場合は、
abc
a
b
c
下記のようにして一個以上の改行に一致させて、
n\+
n\で置き換えると
abc
a
b
c
上記のように改行が一つに統一される。
キャプチャを使って置換する
()を使うと、括弧内の内容を記憶することができる。
例えば、下記のようなリストがあって、それをHTMLのリンクタグにしたい場合、
google,https://google.com
example, https://example.com
下記のようにすると一致させることができる。
.+,\s?.+
()を使って記憶させて、
(.+),\s?(.+)
$1,$2を使って、置き換えると、
<a href="$2">$1</a>
<a href="https://google.com">google</a>
<a href="https://example.com">example</a>
となり、リストをHTMLのリンクに置き換えることができました。
後方参照
下記のような文字列があり、前の数字が後ろの数字と一致しているかを調べたい場合、
3, 8, 5, 4, 4, 5, 4, 1, 1, 5, 3, 3
()と\1を使って、
(\d),\s\1
とすると、4, 4、1, 1、3, 3などの連続している数字に一致させることができる。
\1は、後方参照するものが多ければ、\1, \2, \3, ...と使うことができる。
以上が、ドットインストールで勉強できる内容です。
下記のURLより、勉強することができます。
ドットインストール
dotinstall.com
RegExr:Regexを勉強するのに便利な有名なサイトです。ドットインストールの勉強をこのサイトでするのもおすすめです。
by Web Dev Simplified
Regexr Website を使ったとてもわかりやすい解説です。Regexrを使ったことがない人は、ぜひ使ってみてください。Regexを勉強するための一番有名なサイトです。説明なども読むことができるのでとても便利です。
Regular Expressions Tutorial
Regular Expressions 101
Course files
Simple RegEx Patterns
Literal, Regex Flag, global, insensitive