🌈
正規表現(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));
参照記事等
Discussion