マッチ位置の指定
正規表現では/\d/
や/abc/
といった文字の指定だけではなく、文字列の先頭や単語の境界といった、位置の指定ができます。
^
: 文字列の先頭
^
は文字列の先頭にマッチします。
/^bcd/
というパターンは、"bcdef"
という文字列では条件が合致しますが、"abcdef"
という文字列では合致しないこととなります。
const regex = /^bcd/
"bcdef".match(regex) // ["bcd"]
"abcdef".match(regex) // null
/[^0-9]/
のように、文字クラスで使用される^
とは異なる意味を持つので注意が必要です。
$
: 文字列の末尾
$
は文字列の末尾を表します。
^
とともに使用することで、完全一致するパターンを指定することもできます。
const regex = /^bcd$/
"bcd".match(regex) // ["bcd"]
"bcdef".match(regex) // null
"abcdef".match(regex) // null
\b
; 単語の境界
\b
は単語境界にマッチします。
\w
で単語文字1、\W
で単語文字以外が表されますが、\w
と\W
の間の位置、文字列の先頭と\w
の間の位置、文字列の末尾と\w
の間の位置のことを単語境界と呼びます。
const regex = /\bbcd/
"a bcd e".match(regex) // ["bcd"]
"abcde".match(regex) // null
"bcde".match(regex) // ["bcd"]
/\bbcd/
のパターンは、"bcd"
の前に単語境界があるときにマッチします。
そのため、"a bcd e"
は"bcd"
の前に単語文字以外の文字" "
(半角スペース)があり、"bcde"
は"bcd"
の箇所が文字列の先頭であるためマッチします。
また、\B
は単語境界以外にマッチします。
(?=pattern)
: 先読み言明
先読み言明は、pattern
部分が後ろに存在する場合にパターンに合致するよう指定できます。
パターンの条件には含まれますが、マッチ箇所の文字列にはそのパターンが含まれないようになります。
例えば、/abc(?=d)/
とすると、"abc"
はパターンに合致しませんが、"abcd"
はパターンに合致します。
ただし、マッチ箇所の文字列は"abc"
となり、先読み言明に含まれている"d"
はマッチ箇所の文字列には含まれません。
const regex = /abc(?=d)/
"abc".match(regex) // null
"abcd".match(regex) // ["abc"]
後方にpattern
があるかどうか、先を読んでいるので「先読み」というわけですね。
(?!pattern)
: 否定先読み言明
(?=)
ではなく(?!)
とすることで、先読み言明の否定を指定できます。
(?<=pattern)
: 後読み言明
先読み言明では後方の文字が条件にあうかを確認していましたが、後読み言明では前方の文字が条件にあうかを確認します。
const regex = /(?<=a)bcd/
"abc".match(regex) // null
"abcd".match(regex) // ["bcd"]
後読み言明はECMAScript 2018 (ES9) から使用可能です。
(?<!pattern)
: 否定後読み言明
(?<=)
ではなく(?<!)
とすることで、後読み言明の否定を表します。
-
単語文字は
[A-Za-z0-9_]
でもあらわせます。 ↩