0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マッチ位置の指定

正規表現では/\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): 否定後読み言明

(?<=)ではなく(?<!)とすることで、後読み言明の否定を表します。

  1. 単語文字は[A-Za-z0-9_]でもあらわせます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?