正規表現の書き方(メタ文字, 否定, OR条件, 繰り返し, エスケープなど)

正規表現を活用すると大量の文章の中から、特定パターンの文字列を素早く見つけ出すことができます。ここでは、利用頻度の高い正規表現の書き方について利用例とともに紹介します。

目次

正規表現の書き方

javascriptの利用例とともに正規表現について確認します。

下記例では、abcabcという文字列の中に、abというパターンにマッチする文字列が2つあることがわかります。

const pattern = /ab/g
const testText = 'abcabc'
console.log(testText.match(pattern))
// [ 'ab', 'ab' ]

^ $
( 行頭・行末 )

^ は行頭にマッチします。

const pattern = /^ab/g
const testText = 'abcabc'
console.log(testText.match(pattern))
// [ 'ab' ]

$ は行末にマッチします。

const pattern = /bc$/g
const testText = 'abcabc'
console.log(testText.match(pattern))
// [ 'bc' ]

.
( 任意の一文字 )

. は任意の一文字とマッチします。

const pattern = /c.e/g
const testText = 'abcdefg'
console.log(testText.match(pattern))
// [ 'cde' ]

.. は任意の二文字とマッチします。

const pattern = /c..f/g
const testText = 'abcdefg'
console.log(testText.match(pattern))
// [ 'cdef' ]

[...]
( 括弧内のいずれかの一文字 )

[bcd]b c d のいずれか一文字とマッチします。

const pattern = /a[bcd]a/g
const testText = 'abaacaada'
console.log(testText.match(pattern))
// [ 'aba', 'aca', 'ada' ]

[^...]
( 括弧内の文字以外 )

[^c]c 以外の文字にマッチします。

const pattern = /a[^c]a/g
const testText = 'abaacaada'
console.log(testText.match(pattern))
// [ 'aba', 'ada' ]

[a-zA-Z0-9_] [ぁ-ん] [ァ-ヴ]

[a-z] は小文字アルファベットにマッチします。

const pattern = /[a-z]/g
const testText = 'abcABC012あいうアイウアイウ_'
console.log(testText.match(pattern))
// [ 'a', 'b', 'c' ]

[0-9] は数字にマッチします。

const pattern = /[0-9]/g
const testText = 'abcABC012あいうアイウアイウ_'
console.log(testText.match(pattern))
// [ '0', '1', '2' ]

[a-zA-Z0-9_] はアルファベット・数字・アンダーバーにマッチします。

const pattern = /[a-zA-Z0-9_]/g
const testText = 'abcABC012あいうアイウアイウ_'
console.log(testText.match(pattern))
// [ 'a', 'b', 'c', 'A', 'B', 'C', '0', '1', '2', '_' ]

[ぁ-ん] はひらがなにマッチします。

const pattern = /[ぁ-ん]/g
const testText = 'abcABC012あいうアイウアイウ_'
console.log(testText.match(pattern))
// [ 'あ', 'い', 'う' ]

[ァ-ヴ] はカタカナにマッチします。

const pattern = /[ァ-ヴ]/g
const testText = 'abcABC012あいうアイウアイウ_'
console.log(testText.match(pattern))
// [ 'ア', 'イ', 'ウ' ]

[ヲ-゚] は半角カタカナにマッチします。

const pattern = /[ヲ-゚]/g
const testText = 'abcABC012あいうアイウアイウ_'
console.log(testText.match(pattern))
// [ 'ア', 'イ', 'ウ' ]

* *? + +? ? ??
( 繰り返し )

* は、直前文字0回以上繰り返しでマッチします。(最長一致)
*? は、直前文字0回以上繰り返しでマッチします。(最短一致)
+ は直前文字1回以上繰り返しでマッチします。(最長一致)
+? は直前文字1回以上繰り返しでマッチします。(最短一致)
? は直前文字0回 or 1回繰り返しでマッチします。(最長一致)
?? は直前文字0回 or 1回繰り返しでマッチします。(最短一致)

const pattern11 = /ab*c/g
const pattern21 = /ab+c/g
const pattern31 = /ab?c/g
const testText = 'acabcabbcabbbc'
console.log(testText.match(pattern11)) // [ 'ac', 'abc', 'abbc', 'abbbc' ]
console.log(testText.match(pattern21)) // [ 'abc', 'abbc', 'abbbc' ]
console.log(testText.match(pattern31)) // [ 'ac', 'abc' ]
const pattern11 = /ab*/g
const pattern12 = /ab*?/g
const pattern21 = /ab+/g
const pattern22 = /ab+?/g
const pattern31 = /ab?/g
const pattern32 = /ab??/g
const testText = 'acabcabbcabbbc'
console.log(testText.match(pattern11)) // [ 'a', 'ab', 'abb', 'abbb' ]
console.log(testText.match(pattern12)) // [ 'a', 'a', 'a', 'a' ]
console.log(testText.match(pattern21)) // [ 'ab', 'abb', 'abbb' ]
console.log(testText.match(pattern22)) // [ 'ab', 'ab', 'ab' ]
console.log(testText.match(pattern31)) // [ 'a', 'ab', 'ab', 'ab' ]
console.log(testText.match(pattern32)) // [ 'a', 'a', 'a', 'a' ]

{n} {n,} {n,m}
( 繰り返し回数指定 )

{1} は、直前文字1回繰り返しでマッチします。(最長一致)
{1,} は、直前文字1回以上繰り返しでマッチします。(最長一致)
{1,2} は、直前文字1回 or 2回繰り返しでマッチします。(最長一致)

const pattern1 = /ab{1}c/g
const pattern2 = /ab{1,}c/g
const pattern3 = /ab{1,2}c/g
const testText = 'acabcabbcabbbc'
console.log(testText.match(pattern1)) // [ 'abc' ]
console.log(testText.match(pattern2)) // [ 'abc', 'abbc', 'abbbc' ]
console.log(testText.match(pattern3)) // [ 'abc', 'abbc' ]

(...)
( グループ化 )

() で囲むことでグループ化できます。

(ab){2} とすることで、ab という文字列が2回繰り返される箇所にマッチします。

const pattern = /(ab){2}/g
const testText = 'ababcd ababab'
console.log(testText.match(pattern))
// [ 'abab', 'abab' ]

(ab){3} とすることで、ab という文字列が3回繰り返される箇所にマッチします。

const pattern = /(ab){3}/g
const testText = 'ababcd ababab'
console.log(testText.match(pattern))
// [ 'ababab' ]

|
( OR条件 )

(ab|cd)ab または cd にマッチします。

const pattern = /ab(ab|cd)/g
const testText = 'abcd abab'
console.log(testText.match(pattern))
// [ 'abcd', 'abab' ]

\d \w \s
( メタ文字 )

メタ文字説明
\d数字にマッチ。[0-9]と同じ。
\D数字以外にマッチ。[^0-9]と同じ。
\w[a-zA-Z_0-9]と同じ。
\W[^a-zA-Z_0-9]と同じ。
\s空白(タブ、改行、半角スペース)にマッチ
\S空白(タブ、改行、半角スペース)以外にマッチ
\tタブ
\r改行(CR)
\n改行(LF)
WindowsとMacの改行について

Windows は \r\n(CRLF)です。Mac・Unix は \n(LF)です。

\
( 直後の文字をエスケープ )

\ で直後の文字をエスケープできます。

const pattern = /\(abc\)/g
const testText = 'aaa(abc)aaa'
console.log(testText.match(pattern))
// [ '(abc)' ]

基本正規表現と拡張正規表現

Linuxで正規表現を利用するときには、基本正規表現(BRE: basic-regexp)拡張正規表現(ERE: extended-regexp) の違いを意識する必要があります。

grepは、デフォルトだと基本正規表現になります。 -Eオプションを利用すると拡張正規表現で検索できます。

正規表現コマンド
基本正規表現grep sed
拡張正規表現grep -E egrep sed -r awk
よかったらシェアしてね!
目次