LoginSignup
4
3

More than 3 years have passed since last update.

使いこなそう正規表現(入門)

Last updated at Posted at 2020-03-25

この記事は株式会社クロノスの「~2020年春~勝手にやりますアドベントカレンダー」の18日目の記事です!

はじめに

正規表現の基本知識をまとめました。

正規表現は、ファイル検索や文字列置換を行うときに使用することができます。

エディタの検索で正規表現を活用することで、検索効率や置換効率があがるので活用していきましょう。
VSCodeでは以下の「.*」を選択すると正規表現が使用できるようなります。
image.png

サンプルコードは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つの役割があります。
1. 直前の文字は省略可能
1. 最短マッチにする。

【例】

  1. 直前の文字は省略可能。
'https'.match(/https?/)[0];
// "https"
'http'.match(/https?/)[0];
// "http"
  1. 最短マッチにする。
'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)"

^

  1. 行の始まりにマッチする。
  2. [] 内で使用した場合、否定の意味になる。

【例】

  1. 行の始まりにマッチする。
'http://www.test.com'.match(/^http/)[0];
// "http"
'http://www.test.com'.match(/^www/)[0];
// エラー ( Cannot read property '0' of null )
  1. [] 内で使用した場合、否定の意味になる。
'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"

{}

  1. 直前の文字の桁数を指定可能。
  2. {n,} で桁数n以上の指定が可能
  3. {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"
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3