トップページに戻る
Javascript 正規表現
- RegExp(正規表現)作成方法: リテラル表記:
・
コードが簡潔で、特に固定パターンを使う場合に便利
・ エスケープが必要な文字列(例:\)も書きやすい
const text = "hello world";
const result = text.match(/hello/);
console.log(result[0]); // "hello"
フラグ:
• g: グローバル検索(すべての一致を見つける)
• i: 大文字小文字を区別しない
• m: 複数行モード
• 例: /hello/gi
- 特殊文字
. 改行を除く任意の1文字
[^] 改行を含む任意の1文字
^ 入力の先頭
$ 入力の末尾
* 直前のパターンの0回以上の繰り返し
+ 直前のパターンの1回以上繰り返し
? 直前のパターンが0回または1回の場合
{n} 直前のパターンの n 回 繰り返し
n,} 直前のパターンの n 回以上の繰り返し
{n,m} 直前のパターンの n 回以上 m 回以下の繰り返し
? (量指定子後) 最小マッチ
` ` 複数の選択肢(`A B` は A または B にマッチ)
( ) グループ化、キャプチャ
(?: )
非キャプチャグループ(マッチするがキャプチャしない)
\ 次の文字をエスケープ
- エスケープシーケンス
\d |
数字([0-9] ) |
\D |
数字以外([^0-9] ) |
\w |
単語文字([a-zA-Z0-9_] ) |
\W |
単語文字以外([^a-zA-Z0-9_] ) |
\s |
空白文字(スペース、タブ、改行など) |
\S |
空白文字以外 |
\b |
単語境界 |
\B |
単語境界以外 |
\n |
改行文字 |
\r |
キャリッジリターン (行頭復帰) |
\t |
タブ文字 |
\0 |
NULL文字 |
- RegExp(正規表現)作成方法: RegExpオブジェクト
・ 動的に正規表現を作成する場合に便利
・ たとえば、変数や文字列をパターンとして使用できる
const text = "hello world";
const regex = new RegExp("hello");
const result = text.match(regex);
console.log(result[0]); // "hello"
フラグ:
• s: dot-allモード。 . が改行文字にもマッチする
• g: グローバル検索(すべての一致を見つける)
• i: 大文字小文字を区別しない
• m: 複数行モード
• u: Unicode文字を正しく扱う
• y: 現在の位置からのみマッチを試みる
const regex = new RegExp("hello", "g");
- • 文字列置換: replace
• パターン分割: split
• すべての一致取得: matchAll
• 一致確認: test
• 一致詳細取得: exec
• 一致位置取得: search
- match メソッド
String.prototype.match() は、文字列に正規表現を適用して一致する部分を取得します。
基本構文:
const result = string.match(pattern);
戻り値:
• gフラグあり: 一致した全体の文字列を配列で返します。
• gフラグなし: 最初の一致情報(キャプチャグループ含む)を配列で返します。
• 一致がない場合はnullを返します。
例:
const text = "hello world, hello JavaScript";
const regex = /hello/g;
const matches = text.match(regex);
console.log(matches); // ["hello", "hello"]
const nonGlobalRegex = /hello/;
const firstMatch = text.match(nonGlobalRegex);
console.log(firstMatch[0]); // "hello"
console.log(firstMatch.index); // 0 (最初の一致位置)
- search メソッド
String.prototype.search() は、文字列に正規表現を適用し、最初に一致した位置を返します。
基本構文:
const index = string.search(pattern);
戻り値:
• 最初に一致した部分の開始位置を返します。
• 一致がない場合は-1を返します。
例:
javascript
const text = "hello world, hello JavaScript";
const regex = /hello/;
const index = text.search(regex);
console.log(index); // 0 (最初の "hello" の位置)
const noMatch = text.search(/python/);
console.log(noMatch); // -1 (一致なし)
- キャプチャグループ:
const text = "function foo() {}";
const regex = /function (\w+)\(\)/;
const result = text.match(regex);
console.log(result[1]); // "foo" (キャプチャされた関数名)
gフラグとキャプチャの注意点:
・ g
フラグを付けるとキャプチャグループが配列に含まれない
・ 詳細情報が必要な場合は g を省略する
- replace
文字列内の一部を置換する
•
正規表現を使用することで、パターンマッチングした部分を置換できる
• g フラグを使用すると、すべての一致部分を置換する
• 置換にはコールバック関数を使うことも可能
例:
const text = "hello world, hello JavaScript";
const replaced = text.replace(/hello/g, "hi");
console.log(replaced); // "hi world, hi JavaScript"
// コールバック関数で処理
const replacedCallback = text.replace(/(hello)/g, (match) => {
return match.toUpperCase();
});
console.log(replacedCallback); // "HELLO world, HELLO JavaScript"
- split
文字列を指定したパターンで分割し、配列を生成する
•
正規表現を使用することで、特定のパターンに基づいて分割できる
例:
const text = "apple, banana, cherry";
const parts = text.split(/,\s*/);
console.log(parts); // ["apple", "banana", "cherry"]
- matchAll
正規表現で文字列内のすべての一致を反復的に取得する。g
フラグが必要
• キャプチャグループを含む詳細なマッチ情報を提供します。
• matchAll はイテレーターを返すため、for...of ループやスプレッド構文で利用します。
例:
const text = "a1b2c3";
const regex = /(\w)(\d)/g; // 文字と数字のペアをキャプチャ
const matches = text.matchAll(regex);
for (const match of matches) {
console.log(match[0]); // "a1", "b2", "c3"
console.log(match[1]); // "a", "b", "c" (キャプチャグループ1)
console.log(match[2]); // "1", "2", "3" (キャプチャグループ2)
}
- matchAllとmatch関数の違い
match:
・ match はシンプルで早いが、キャプチャグループを得るには g
フラグを付けない必要がある
・ 単純なマッチング結果が必要なとき(例えば一致部分の配列だけが必要)。
・ グローバル一致が不要で、最初の一致とキャプチャグループだけ使う場合。
matchAll:
• matchAll
は詳細で柔軟性が高く、キャプチャグループも利用可能だが、少し複雑な処理になる。
・ 一致結果をすべて取得し、キャプチャグループや一致の位置(index)を含む詳細なデータが必要なとき。
・ イテレーターの利点を活かしたループ処理を行いたい場合。
1. match の挙動
String.prototype.match()
は、文字列内の一致を検索し、以下のように動作する。
• g フラグが ない場合: 最初の一致(キャプチャグループを含む)だけを返します。
• g フラグが ある場合: 一致した部分文字列だけを配列で返し、キャプチャグループは含みません。
match の例
const text = "abc123abc456";
const regex = /\d+/g;
// g フラグあり:すべての一致を配列で返す
const result = text.match(regex);
console.log(result); // ["123", "456"]
// g フラグなし:最初の一致情報を配列で返す
const regexWithoutG = /(\d+)/;
const resultWithGroups = text.match(regexWithoutG);
console.log(resultWithGroups);
// ["123", "123"]
// resultWithGroups[1] -> "123" (キャプチャグループ)
2. matchAll の挙動
String.prototype.matchAll()
は、常にすべての一致結果を取得し、さらにキャプチャグループを含む詳細な情報を提供する。g
フラグが必要。
• 戻り値は配列ではなく、イテレーターです。
• そのため、for...of やスプレッド構文([...matches])で取り出す必要があります。
matchAll の例
const text = "abc123abc456";
const regex = /(\d+)/g;
// イテレーターを取得
const matches = text.matchAll(regex);
// イテレーターをループで使う
for (const match of matches) {
console.log(match[0]); // マッチ全体(例: "123", "456")
console.log(match[1]); // キャプチャグループ(例: "123", "456")
}
// スプレッド構文で配列化
const matchesArray = [...text.matchAll(regex)];
console.log(matchesArray);
// [
// ["123", "123", index: 3, input: "abc123abc456", groups: undefined],
// ["456", "456", index: 9, input: "abc123abc456", groups: undefined]
// ]
- test
正規表現に基づいて文字列に一致するかどうかを確認する
• 一致する場合は true を、しない場合は false を返します。
例:
const regex = /hello/;
console.log(regex.test("hello world")); // true
console.log(regex.test("hi world")); // false
- exec
正規表現の最初の一致情報を詳細に取得する
• 一致情報(キャプチャグループを含む)を含む配列を返します。
• グローバルフラグ g を使用すると、反復的に一致を取得できます。
例:
const text = "hello world";
const regex = /(\w+) (\w+)/;
const result = regex.exec(text);
console.log(result[0]); // "hello world" (全体の一致)
console.log(result[1]); // "hello" (キャプチャグループ1)
console.log(result[2]); // "world" (キャプチャグループ2)