JavaScript regexp (正規表現):変数のデータ型

English version.

JavaScriptにおけるRegExpオブジェクトは、正規表現を表すために使用されます。正規表現は、文字列の検索や置換などの処理に使用されます。RegExpオブジェクトは、正規表現パターンを指定することによって作成されます。

正規表現パターンは、以下の要素から構成されます。

  • 文字列:正確に一致する文字列。
  • 特殊文字:文字の集合を表すもので、例えば[a-z]は小文字のアルファベットを表します。
  • オプションフラグ(パターン修飾子):g(グローバル)、i(大文字小文字を区別しない)、m(マルチライン)などのパターン修飾子を指定することができます。

RegExpオブジェクトは、正規表現パターンを含む文字列と、オプションとしてパターン修飾子を指定することによって作成されます。

以下は、RegExpオブジェクトを使用して正規表現パターンを作成する例です。

// 正規表現パターンを含む文字列を作成する
var pattern = "test";

// パターン修飾子を含めたRegExpオブジェクトを作成する
var regexp = new RegExp(pattern, "gi");

この例では、正規表現パターンを含む文字列"test"を作成し、giを指定してRegExpオブジェクトを作成しています。giは、グローバル検索を有効にし、大文字小文字を区別しない検索を有効にします。

RegExpオブジェクトには、正規表現パターンと一致する文字列を検索するための多数のメソッドがあります。test()メソッドは、文字列が正規表現パターンと一致するかどうかを判断し、exec()メソッドは、正規表現パターンに一致する部分文字列を検索します。

以下は、RegExpオブジェクトのtest()メソッドとexec()メソッドを使用して、文字列内の正規表現パターンを検索する例です。

// 正規表現パターンを含む文字列を作成する
var pattern = "test";

// パターン修飾子を含めたRegExpオブジェクトを作成する
var regexp = new RegExp(pattern, "gi");

// 検索対象の文字列を指定する
var string = "This is a test. This is only a test.";

// test()メソッドを使用して検索する
var result1 = regexp.test(string);

// exec()メソッドを使用して検索する
var result2 = regexp.exec(string);

// 結果を出力する
console.log(result1);
console.log(result2);

この例では、RegExpオブジェクトを作成してから、test()メソッドを使用して文字列内の正規表現パターンを検索し、結果をresult1に格納しています。また、exec()メソッドを使用して、文字列内の最初の正規表現パターンに一致する部分文字列を検索し、結果をresult2に格納しています。最後に、結果を出力しています。

RegExpオブジェクトは、正規表現パターンを使って文字列を検索したり、置換したりすることができます。Stringオブジェクトのreplace()メソッドを使用して、文字列内の正規表現パターンに一致する部分文字列を置換することができます。

以下は、RegExpオブジェクトを使用して、文字列内の正規表現パターンに一致する部分文字列を置換する例です。

// 正規表現パターンを含む文字列を作成する
var pattern = "test";

// パターン修飾子を含めたRegExpオブジェクトを作成する
var regexp = new RegExp(pattern, "gi");

// 検索対象の文字列を指定する
var string = "This is a test. This is only a test.";

// replace()メソッドを使用して置換する
var result = string.replace(regexp, "example");

// 結果を出力する
console.log(result);

この例では、RegExpオブジェクトを作成してから、replace()メソッドを使用して文字列内の正規表現パターンに一致する部分文字列をすべてexampleに置換しています。最後に、結果を出力しています。

特殊文字

文字クラス

文字や数字など、文字の種類を区別します。

任意の1文字

. // 改行を除くいずれかの文字に一致する

単一の文字

単一の文字を指定する場合、文字クラス内にその文字を指定します。

[abc] // a、b、cのいずれかに一致する

範囲

範囲を指定する場合、-で区切られた最初の文字から最後の文字までの範囲を指定します。

[a-z] // 小文字のアルファベットに一致する
[A-Z] // 大文字のアルファベットに一致する
[0-9] // 数字に一致する

否定

否定の文字クラスを作成するには、^を最初に指定します。

[^abc] // a、b、c以外の任意の1文字に一致する

複数の文字クラス

複数の文字クラスを指定するには、文字クラス内に別の文字クラスを含めます。

[a-zA-Z] // 小文字と大文字のアルファベットに一致する
[a-zA-Z0-9] // 英数字に一致する
[^\s] // 空白文字以外の任意の1文字に一致する

文字セット

  • \d: 数字文字に一致します。[0-9]と同じです。
  • \D: 数字以外の任意の1文字に一致します。[^0-9]と同じです。
  • \s: スペース文字に一致します。タブ、改行、復帰、およびスペース文字を含みます。
  • \S: スペース以外の任意の1文字に一致します。
  • \w: 英数字に一致します。アンダースコアも含みます。
  • \W: 英数字以外の任意の1文字に一致します。
  • \f: 改ページ文字に一致します。
  • \n: 改行文字に一致します。
  • \r: 復帰文字に一致します。
  • \t: タブ文字に一致します。
  • \v: 縦タブ文字に一致します。
  • \0: Null文字に一致します。
  • [\b]: バックスペース文字に一致します。

数量詞

数量詞は、一致させる文字や式の数を示します。

  • *: 直前の文字が0回以上繰り返されることを表します。例えば、正規表現 /ab*c/は、ac, abc, abbcなどに一致します。
  • +: 直前の文字が1回以上繰り返されることを表します。例えば、正規表現 /ab+c/は、abc, abbc, abbbcなどに一致しますが、acには一致しません。
  • ?: 直前の文字が0回または1回出現することを表します。例えば、正規表現 /colou?r/は、colorcolourに一致します。
  • {n}: 直前の文字がn回出現することを表します。例えば、正規表現 /a{3}/は、aaaに一致します。
  • {n,}: 直前の文字がn回以上出現することを表します。例えば、正規表現 /a{3,}/は、aaa, aaaa, aaaaaなどに一致します。
  • {n,m}: 直前の文字がn回以上m回以下出現することを表します。例えば、正規表現 /a{3,5}/は、aaa, aaaa, aaaaaに一致しますが、aaaaaaaaには一致しません。

アサーション

位置や境界を指定します。

  • ^: 文字列の先頭に一致することを表します。例えば、正規表現 /^hello/は、hello worldのような文字列の先頭にあるhelloにのみ一致します。
  • $: 文字列の末尾に一致することを表します。例えば、正規表現 /world$/は、hello worldのような文字列の末尾にあるworldにのみ一致します。
  • \b: 単語の境界に一致します。
  • \B: 単語の境界以外の任意の1文字に一致します。

オプションフラグ(パターン修飾子)

これらのフラグは、正規表現の振る舞いを変更するために使用されます。

  • g (Global): 正規表現に一致する全ての部分文字列を検索します。このフラグがない場合、最初の一致した部分文字列のみが検索されます。
  • i (Ignore case): 大文字と小文字を区別せずに検索します。
  • m (Multiline): 複数行のテキストでマッチングを行います。
  • s (Dot all): .メタ文字を、改行文字を含む全ての文字に一致するようにします。
  • u (Unicode): ユニコードをサポートします。このフラグを使うことで、サロゲートペアや合成文字などのUnicode文字を正しく扱うことができます。
  • y (Sticky): マッチを、前回の検索結果の直後から開始します。このフラグがない場合、全ての部分文字列を検索対象とします。

キャプチャグループ

キャプチャグループは、括弧で囲まれた部分をマッチング結果に含めるグループです。マッチングに成功した場合、キャプチャグループにマッチングした部分文字列が格納されます。

const regex = /(\d+)-(\d+)-(\d+)/;
const str = '2022-04-28';
const match = str.match(regex);

console.log(match); // [ '2022-04-28', '2022', '04', '28', index: 0, input: '2022-04-28', groups: undefined ]

この例では、(\d+)-(\d+)-(\d+)という正規表現を使って、2022-04-28という文字列をマッチングしています。この正規表現には、3つのキャプチャグループが含まれています。マッチングに成功すると、マッチング結果の配列には、キャプチャグループの内容が含まれます。例えば、match[1]には年の部分である2022が格納されます。

メソッド

search()

search()メソッドは、正規表現にマッチする最初の部分文字列の位置を返します。文字列中に複数のマッチがある場合、最初のマッチの位置が返されます。マッチが見つからなかった場合、-1が返されます。

search()メソッドを使った例を以下に示します。

const str = 'The quick brown fox jumps over the lazy dog';
const result = str.search(/fox/);

console.log(result); // 16

この例では、文字列'The quick brown fox jumps over the lazy dog'から正規表現/fox/にマッチする最初の部分文字列を検索しています。正規表現は、文字列の16番目の位置から始まる部分文字列'fox'にマッチするため、search()メソッドは16を返します。

search()メソッドは、文字列の中で正規表現に一致する最初の部分文字列を検索するのに役立ちます。次の例では、正規表現/\d+/を使って、文字列中の最初の数値を検索します。

const str = 'I have 2 cats and 3 dogs';
const result = str.search(/\d+/);

console.log(result); // 7

この例では、文字列'I have 2 cats and 3 dogs'から正規表現/\d+/にマッチする最初の部分文字列を検索しています。正規表現は、文字列の7番目の位置から始まる部分文字列'2'にマッチするため、search()メソッドは7を返します。

search()メソッドは、正規表現にマッチする最初の部分文字列の位置を返すため、indexOf()メソッドを使用して同じ結果を得ることができます。ただし、search()メソッドは正規表現を使用してパターンマッチングを行うため、より柔軟な検索が可能です。

最初だけでなく、全て(複数)の結果が欲しい場合と一致した文字列など文字数以外の情報が欲しい場合はexec()の方が適切です。

一致するものが存在するかを確認するだけであればtest()の方が適切です。

exec()

exec()メソッドは、正規表現に一致する最初の部分文字列を検索し、その部分文字列を含む配列を返します。配列には、一致する部分文字列、マッチした部分文字列のインデックス、入力文字列、および一致した部分文字列の後の文字列が含まれます。一致する部分文字列が見つからない場合は、nullが返されます。

以下はexec()メソッドを使用したサンプルコードです。

const regex = /hello/g;
const str = 'hello world';
let match = regex.exec(str);

console.log(match); // ['hello']
console.log(match.index); // 0
console.log(match.input); // 'hello world'

match = regex.exec(str);
console.log(match); // null

この例では、正規表現/hello/gを定義し、文字列'hello world'exec()メソッドを呼び出しています。最初の呼び出しでは、文字列'hello'に一致する部分文字列が見つかり、match配列に一致した部分文字列'hello'が格納されます。match.indexプロパティには、一致した部分文字列のインデックスが格納され、match.inputプロパティには、入力文字列'hello world'が格納されます。2回目の呼び出しでは、一致する部分文字列が見つからなかったため、nullが返されます。

exec()メソッドは、正規表現にグループがある場合にも使えます。グループに一致する部分文字列は、配列の要素として追加されます。以下は、グループがある正規表現を使ったexec()メソッドの例です。

const regex = /(\w+)\s(\w+)/;
const str = 'John Smith';
const match = regex.exec(str);

console.log(match); // ['John Smith', 'John', 'Smith']
console.log(match[1]); // 'John'
console.log(match[2]); // 'Smith'

この例では、正規表現/(\w+)\s(\w+)/を定義し、文字列'John Smith'exec()メソッドを呼び出しています。一致する部分文字列'John Smith'と、グループに一致する部分文字列'John'および'Smith'match配列に格納されます。match[1]には、最初のグループに一致する部分文字列が、match[2]には、2番目のグループに一致する部分文字列が格納されます。

exec()メソッドは、文字列中で正規表現に一致するすべての部分文字列を検索するために繰り返し呼び出すこともできます。次の例では、正規表現/\d+/gを使って、文字列中のすべての数値を検索します。

const regex = /\d+/g;
const str = 'I have 2 cats and 3 dogs';
let result;

while ((result = regex.exec(str)) !== null) {
  console.log(result[0]); // 2, 3
}

この例では、whileループを使って、test()メソッドを繰り返し呼び出し、文字列中のすべての数値を検索しています。regex.exec(str)は、一致する部分文字列を返します。whileループは、すべての一致する部分文字列を処理するまで繰り返されます。

test()

test()メソッドは、指定された文字列が正規表現に一致するかどうかを真偽値で返します。test()メソッドは、文字列の一部分が正規表現に一致しているかどうかを判断するのに役立ちます。

test()メソッドを使った例を以下に示します。

const regex = /world/;
const str = 'hello world';
const result = regex.test(str);

console.log(result); // true

この例では、文字列'hello world'と正規表現/world/を比較しています。文字列中に'world'という部分文字列があるため、test()メソッドはtrueを返します。

test()メソッドは、文字列の中で正規表現に一致するすべての部分文字列を検索するために使用できます。次の例では、正規表現/\d+/を使って、文字列中の数値を検索します。

const regex = /\d+/g;
const str = 'I have 2 cats and 3 dogs';
const result = regex.test(str);

console.log(result); // true

この例では、文字列'I have 2 cats and 3 dogs'と正規表現/\d+/gを比較しています。この正規表現は、文字列中の1つ以上の数字に一致するため、test()メソッドはtrueを返します。

match()

match()メソッドは、正規表現にマッチする部分文字列を検索して、結果を配列で返します。引数には、検索する対象の文字列またはRegExpオブジェクトを渡します。

const str = 'The quick brown fox jumps over the lazy dog';
const regex = /the/gi;
const result = str.match(regex);

console.log(result); // ['The', 'the']

この例では、文字列'The quick brown fox jumps over the lazy dog'から正規表現/the/giにマッチする文字列を検索します。正規表現は、大文字小文字を区別せずに'the'にマッチするので、match()メソッドは配列['The', 'the']を返します。配列には、文字列の中に'the'が2つ含まれているため、配列の要素数も2つになっています。

match()メソッドは、正規表現にグループが含まれている場合、配列にグループにマッチした文字列も含まれます。以下は、正規表現にグループを含めた例です。

const str = 'The quick brown fox jumps over the lazy dog';
const regex = /the (\w+)/gi;
const result = str.match(regex);

console.log(result); // ['The quick', 'the lazy']

この例では、正規表現/the (\w+)/giにマッチする文字列を検索します。正規表現は、大文字小文字を区別せずに'the'にマッチする文字列を検索し、その後に空白と1つ以上の単語文字(アルファベット、数字、アンダースコア)が続く文字列にマッチします。match()メソッドは、配列['The quick', 'the lazy']を返します。この配列には、それぞれ'The quick''the lazy'にマッチする文字列が含まれています。

replace()

replace() メソッドは、文字列内の一致する部分を置換するために使用されるJavaScriptの正規表現メソッドの一つです。 replace() メソッドは、指定された正規表現パターンまたは文字列を使用して、最初に一致した部分のみまたはすべての一致した部分を別の文字列で置換します。

次の例では、文字列内の最初の "apple""orange" に置き換えられます。

const str = 'I have an apple and she has an apple too.';
const newStr = str.replace(/apple/, 'orange');

console.log(newStr); // "I have an orange and she has an apple too."

上記の例では、文字列が apple を含むため、最初に一致した apple のみが置換されます。

正規表現を使用する場合、g フラグを指定することですべての一致を置換できます。

const str = 'I have an apple and she has an apple too.';
const newStr = str.replace(/apple/g, 'orange');

console.log(newStr); // "I have an orange and she has an orange too."

上記の例では、正規表現 /apple/g が使用され、文字列内のすべての一致が置換されます。

また、replace() メソッドは、置換用の関数を指定することもできます。置換用の関数は、一致した部分文字列と、一致した文字列の位置などの情報を受け取り、置換するテキストを返します。

const str = 'I have an apple and she has an apple too.';

const newStr = str.replace(/apple/g, (match, offset) => {
  if (offset === 10) {
    return 'orange';
  }
  return 'banana';
});

console.log(newStr); // " I have an orange and she has an banana too."

上記の例では、一致する部分文字列と、その文字列の位置を受け取る置換用の関数が使用されます。10文字目に一致した部分文字列のみが "orange" に置換され、その他の部分文字列は "banana" に置換されます。

split()

RegExpオブジェクトのsplit()メソッドは、指定された正規表現に基づいて文字列を分割し、分割した結果の文字列の配列を返します。

const regex = / [,-\.]/;
const str = ' He,llo-wor.ld';
const result = str.split(regex);

console.log(result); // ['He', 'llo', 'wor', 'ld']

この例では、split()メソッドを使って、空白文字で文字列を分割しています。正規表現[,-\.]は、”,”か”-“か”.”の何れかを表します。split()メソッドは、この正規表現に基づいて文字列を分割し、配列['He', 'llo', 'wor', 'ld']を返します。

---

関連記事

JavaScriptの記事一覧