この記事は株式会社クロノスの「~2020年春~勝手にやりますアドベントカレンダー」の18日目の記事です!
はじめに
正規表現の基本知識をまとめました。
正規表現は、ファイル検索や文字列置換を行うときに使用することができます。
エディタの検索で正規表現を活用することで、検索効率や置換効率があがるので活用していきましょう。
VSCodeでは以下の「.*」を選択すると正規表現が使用できるようなります。
サンプルコードはJavaScriptの match
メソッドを使用しています。
'対象文字列'.match(/正規表現/);
// 取得結果
メタ文字(使用頻度が高いもののみ)
.
任意の1文字 にマッチします。
【例】
'test'.match(/./)[0];
// "t"
+
直前の文字が 1回以上 繰り返す場合にマッチします。
【例】
'tttee'.match(/t+/)[0];
// "ttt"
'tttee'.match(/a+/)[0];
// エラー( Cannot read property '0' of null )
*
直前の文字が 0回以上 繰り返す場合にマッチします。
【例】
'tttee'.match(/t*/)[0];
// "ttt"
'tttee'.match(/a*/)[0];
// ""
[]
角括弧に含まれるいずれかの1文字にマッチします。
角括弧内で「-」を用いることで範囲指定をすることもできます。
【例】
'test'.match(/[abcde]/)[0];
// "e"
'test'.match(/[a-e]/)[0];
// "e"
'13579'.match(/[2-4]/)[0];
// "3"
'090-0000-1111'.match(/0[789]0/)[0];
// "090"
?
「?」には大きく、以下の2つの役割があります。
- 直前の文字は省略可能
- 最短マッチにする。
【例】
- 直前の文字は省略可能。
'https'.match(/https?/)[0];
// "https"
'http'.match(/https?/)[0];
// "http"
- 最短マッチにする。
'test'.match(/.*t/)[0];
// "test" (*は最長マッチ)
'test'.match(/.*?t/)[0];
// "t" (*は最長マッチを最短マッチに変更する)
|
いずれかの条件 (OR条件)として使用可能。
【例】
'test'.match(/s|e/)[0];
// "e"
'sample'.match(/a|p|e/)[0];
// "a"
()
文字を1つのグループとして、まとめることができる。
【例】
'test'.match(/(et)|(te)/)[0];
// "te"
'oioioioiooi'.match(/(oi)+/)[0];
// "oioioioi"
'test_dayo'.match(/test_(dayo)?/)[0];
// "test_dayo"
\
直後の正規表現記号をエスケープする。
【例】
'test.com'.match(/\.com/)[0];
// ".com"
'test(.com)'.match(/\(\.com\)/)[0];
// "(.com)"
^
- 行の始まりにマッチする。
- [] 内で使用した場合、否定の意味になる。
【例】
- 行の始まりにマッチする。
'http://www.test.com'.match(/^http/)[0];
// "http"
'http://www.test.com'.match(/^www/)[0];
// エラー ( Cannot read property '0' of null )
- [] 内で使用した場合、否定の意味になる。
'123456789'.match(/[^0-8]/)[0];
// "9"
'http://www.test.com'.match(/[^w]+/)[0];
// "http://"
$
行の終わりにマッチする。
【例】
'http://www.test.com'.match(/com$/)[0];
// "com"
'http://www.test.com'.match(/com|jp)$/)[0];
// "com"
{}
- 直前の文字の桁数を指定可能。
- {n,} で桁数n以上の指定が可能
- {n,m} で桁数n以上m以下の指定が可能
【例】
'http://www.test.com'.match(/w{3}/)[0];
// "www"
'http://www.test.com'.match(/w{2,}/)[0];
// "www"
'http://www.test.com'.match(/w{2,4}/)[0];
// "www"
(?<=)
直前に特定の文字がある場合にマッチする。(肯定先読み)
【例】
'http://www.test.com'.match(/(?<=www).+/)[0];
// ".test.com"
(?=)
直後に特定の文字がある場合にマッチする。(肯定後読み)
【例】
'http://www.test.com'.match(/.+(?=com)/)[0];
// "http://www.test."
'http://www.test.com'.match(/(?<=www\.).+(?=\.com)/)[0];
// "test"
エスケープシーケンスを使ったメタ文字(使用頻度が高いもののみ)
\d
すべての数字。[0-9]
と同等の意味。
\D
すべての数字以外。[^0-9]
と同等の意味。
\t
タブ。
\n
改行。LF(Line Feed:0x0A)
\s
垂直タブ以外のすべての空白文字。[\t\f\r\n]
と同等の意味。
\S
垂直タブ以外のすべての空白文字以外。[^\t\f\r\n]
と同等の意味。
[\s\S]
で改行を考慮した任意の文字マッチが可能。
\w
アルファベット、アンダーバー、数字。[a-zA-Z_0-9]
と同等の意味。
\W
アルファベット、アンダーバー、数字以外。[^a-zA-Z_0-9]
と同等の意味。
オプション(使用頻度が高いもののみ)
g
最初の1個だけでなく、文字列の最後まで検索を繰り返す。
グローバルマッチとも呼ばれる。
【例】
'test'.match(/t/g);
// ["t", "t"]
i
大文字・小文字を区別しない。
【例】
'test'.match(/T/i);
// "t"
u
文字コードをUTF-8
m
改行を考慮可能。
【例】
`改行を
考慮できる
mオプション`.match(/オプション/m)[0];
// "オプション"
おまけ
$1,$2,$3,...
()
で囲われた文字を参照用変数として、使用することができる。
置換でよく使用する。
【例】
'7月10日'.replace(/(\d{1,2})月(\d{1,2})日/, '$1/$2');
// "7/10"