🌈

正規表現(Regular Expression)

に公開

正規表現とは

文字列の集合を特定の記法で表現する。正規表現は、デリミタ(/「スラッシュ」)で囲んで使用することがほとんど。
URLにマッチするかを判定する場合、「\」のようなエスケープを使用することが多い。
デリミタで正規表現で囲んでURLの確認するようなコードを書いた際に、プログラマ的に見づらくなってしまうこともあるので、「#」に変換すると読みやすくなることがある。

正規表現を使うと具体的にどんなことができるのか?

主に以下のようなことで良く使用する。

  • 判定
  • 検索
  • 置換

正規表現の種類

正規表現は以下のようなものがある。また、正規表現は記法の組み合わせでいろんなパターンをつくることが多い!

記号 説明
. 任意の1文字にマッチする。
* 直前の文字が0文字以上繰り返される場合にマッチする。
+ 直前の文字が1文字以上繰り返される場合にマッチする。
[] 中に記述された文字のいずれか1文字にマッチすす。
- [] の中で使用すると、文字の範囲を指定できる(例: [a-z] は小文字のaからzまでのいずれかの文字にマッチ)。
{n} 直前の文字がn回繰り返される場合にマッチする。
{n,m} 直前の文字がn回以上m回以下繰り返される場合にマッチする。
^ 正規表現のパターンの先頭に置くと、「文字列がこのパターンで始まる」という意味になる
$ 正規表現のパターンの末尾に置くと、「文字列がこのパターンで終わる」という意味になる
() 囲った正規表現にマッチした内容を記録する
(?=...) 「直後に ... が存在する」場合にマッチ。: abc(?=def) "abcdef" にはマッチするが、マッチするのは "abc" の部分だけ。"def" は存在するかどうかの確認に使われるだけ。よって、"abcefg" にはマッチしない。
(?!...) 「直後に ... が存在しない」場合にマッチ。: abc(?!def)"abcefg" にはマッチするが、マッチするのは "abc" の部分だけ。"def" が存在しないことを確認している。"abcdef" にはマッチしない。
(?<=...) 直前に ... が存在する」場合にマッチ。: (?<=¥)d+"¥1000" にはマッチし、マッチするのは "1000" の部分のみ。"¥" が直前に存在することを確認している。"$1000" にはマッチしない。
(?<!...) 「直前に ... が存在しない」場合にマッチ。: (?<![A-Z])d+"123" や "a123" にはマッチするが、マッチするのは "123" の部分のみ。直前に大文字が存在しないことを確認している。"A123" にはマッチしない。

正規表現を確認するためのツール
https://regex101.com/

正規表現の内容をツールを使って確認してみる

【条件】
携帯電話の番号にマッチする正規表現を作る。
最初の3桁は070or080or090のいずれかである。

/0[7-9]0-[0-9]{4}-[0-9]{4}/
/0[7-9]0-\d{4}-\d{4}/

正規表現を使ってソースコードを書いてみる

【条件】
以下の変数の文字列の中に数値が使用されているかを確認したい。

const judgeNums = "Number is 345"

考え方

  • 0~9の数値が入っているかを正規表現でどのように表現するか考える。
  • それに該当するかを確認するメソッドはあるか考える。
  • それをどのようにコードに落とすかを考える。
Javascriptを使用しての実装
const judgeNums = "Number is 345";


function includeNums(numbers){
    const isNumber = numbers.match(/[0-9]/);
    return isNumber !== null;
}

console.log(includeNums(judgeNums));

参照記事等

https://qiita.com/iLLviA/items/b6bf680cd2408edd050f
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Regular_expressions

https://www.youtube.com/live/T7Y2kfMm7kk?si=7YLWslEkQGZMhN6Q

https://youtu.be/909NfO1St0A?si=DPUu-bDf5-8sr6bs

Discussion