正規表現とは
正規表現とは、ある文字列の中に存在する、パターンを表現するものです。
例えば郵便番号を表現するパターンは「0から9の数字のいずれかを、7回繰り返す」となります。
このようなパターン(正規表現)は後述する、「特殊文字」を組み合わせて記述できます。
正規表現は主に、文字列の検索や置き換えなどに使えます。
定義方法
JavaScriptで正規表現を定義する方法は2つあります。
正規表現リテラル
// /パターン/オプションフラグ(後述)
const re = /abc/i;
正規表現リテラルはスクリプトが読み込まれたタイミングで、コンパイルされます。
そのため正規表現のパターンが変わらない場合は、こちらの定義方法のほうがパフォーマンスが良いです。
RegExpコンストラクター
// new RegExp('パターン', 'オプションフラグ(後述)')
const re = new RegExp('abc', 'i');
こちらは関数実行時にコンパイルされます。
そのため正規表現のパターン内にユーザーの入力値を使いたい、などパターンが変わる場合はこちらの定義方法を使います。
特殊文字
正規表現は特殊文字を組み合わせて記述します。
| 文字 | 説明 |
|---|---|
| ^ | 行の先頭にマッチする |
| $ | 行の末尾にマッチする |
| * | 直前の文字の0回以上の繰り返しにマッチする |
| + | 直前の文字の1回以上の繰り返しにマッチする |
| ? | 直前の文字の0回か1回の繰り返しにマッチする |
| {n} | 直前の文字のn回の繰り返しにマッチする |
| {n,} | 直前の文字のn回以上の繰り返しにマッチする |
| {n,m} | 直前の文字のn~m回の繰り返しにマッチする |
| . | 改行文字以外の文字と一致 |
| \ | エスケープ文字 |
| [abc] | 角括弧で囲まれた文字のいずれか一個にマッチする |
| [a-z] | 指定した範囲の文字にマッチする |
| [^abc] | 角括弧で囲まれた文字以外の文字にマッチする |
| \s | 空白にマッチする |
| \w | 英字、数字、アンダースコアにマッチする |
| \W | \w でマッチしない文字とマッチする |
| \d | 数字とマッチする |
| \D | 数字以外とマッチする |
| \n | 改行とマッチする |
| \r | 復帰 とマッチする |
例えば郵便番号の正規表現は以下のように表すことができます。
// 先頭から末尾の間に、0から9の数字のいずれかを、7回繰り返す
const postCode = /^[0-9]{7}$/
オプションフラグ
正規表現には、オプションフラグがあります。
これらは1つでも複数でも使用でき、順序は問いません。
オプションフラグにより、グローバル検索、大文字小文字を問わない検索、などを実現できます。
| オプションフラグ | 説明 |
|---|---|
| d | 一致した部分文字列の位置を生成する |
| g | グローバル検索を行う |
| i | 大文字・小文字を区別しない検索を行う |
| m | 複数行の検索を行う |
| s |
.が改行文字に一致するようにする |
| u | unicode対応 |
| y | 対象文字列の現在の位置から始まる部分に一致するものを探す「先頭固定」検索を行う |
正規表現を使用するメソッド
JavaScriptでは正規表現を、RegExpオブジェクトのtest()とexec()、Stringオブジェクトのmatch()、replace()、search()、split()とともに使用できます。
test()
正規表現にマッチする文字列があるかを判定し、true/falseを返します。
const str = "ABCDEFG";
const re = /[a-c]/i;
const resultTest = re.test(str);
console.log(resultTest); // true
exec()
正規表現にマッチする文字列があるかを検索し、結果を配列で返します。
const str = "ABCDEFG";
const re = /[a-c]/i;
const resultExec = re.exec(str);
console.log(resultExec); // ['A', index: 0, input: 'ABCDEFG', groups: undefined]
match()
正規表現にマッチする文字列があるかを検索し、結果を配列で返します。
RegExpオブジェクトのexec()と基本的に同じですが、gオプションをつけた場合の結果が異なります。
gオプションをつけた場合、マッチする文字列の配列を返します。
const str = "ABCDEFG";
const re = /[a-c]/ig;
const resultMatch = str.match(re);
console.log(resultMatch); // ['A', 'B', 'C']
replace()
正規表現にマッチする文字列を、他の文字列と置き換えることができます。
const str = "ABCDEFG";
const re = /a/i;
const resultReplace = str.replace(re, 'Z');
console.log(resultReplace); // ZBCDEFG
search()
正規表現にマッチする文字列があるかを検索し、一致した位置を返します。
const str = "BCDEFGA";
const re = /a/i;
const resultSearch = str.search(re);
console.log(resultSearch); // 6
split()
正規表現にマッチする文字列を区切りとして、文字列を分割することができます。
const str = "2022/10/25";
const re = /\//;
const resultSplit = str.split(re);
console.log(resultSplit); // ['2022', '10', '25']
参考
採用のお知らせ
株式会社Relicでは、フロントエンドエンジニアを積極的に採用中です。
またRelicでは、地方拠点がありますので、U・Iターンも大歓迎です!🙌
少しでもご興味がある方は、Relic採用サイトからエントリーください!