マッチ位置の指定
正規表現では/\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_]でもあらわせます。 ↩