正規表現は、テキスト処理において非常に強力なツールですが、「特定の文字列だけを一致させない」という要件は、初心者にとっては難しい課題です。
この記事では、正規表現を使って特定の文字列を除外する方法を解説し、実際のサンプルコードを通じて理解を深めていきます。
1. 正規表現の基本を理解する
正規表現は、文字列のパターンを定義するための特別な文字列です。基本的な構文を理解することが、特定の文字列を除外するための第一歩です。以下は、正規表現の基本的な構成要素です。
- リテラル: 文字そのものを表します。例えば、
abc
は「abc」という文字列に一致します。 - メタキャラクター: 特別な意味を持つ文字です。例えば、
.
は任意の1文字に一致します。 - 量指定子: 繰り返しの回数を指定します。例えば、
*
は0回以上、+
は1回以上の繰り返しに一致します。
2. 特定の文字列を除外するための基本的なアプローチ
特定の文字列を一致させないためには、負の先読み(negative lookahead)を使用します。これは、特定のパターンが続かないことを確認するための構文です。
以下の例では、「cat」という単語を除外し、それ以外の単語を一致させる正規表現を示します。
const text = "The cat sat on the mat. The dog barked.";
const regex = /\b(?!cat\b)\w+\b/g;
const matches = text.match(regex);
console.log(matches); // ["The", "sat", "on", "the", "mat.", "The", "dog", "barked."]
このコードでは、(?!cat\b)
が「cat」という単語が続かないことを確認し、他の単語を一致させています。
3. より複雑なケースへの対応
負の先読みを使うことで、特定の文字列を除外するだけでなく、複数の条件を組み合わせることも可能です。
例えば、「cat」と「dog」の両方を除外したい場合、以下のように記述します。
const text = "The cat sat on the mat. The dog barked.";
const regex = /\b(?!cat\b|dog\b)\w+\b/g;
const matches = text.match(regex);
console.log(matches); // ["The", "sat", "on", "the", "mat.", "barked."]
この例では、(?!cat\b|dog\b)
を使って、「cat」と「dog」の両方を除外しています。
4. 特定の文字列が含まれる行を除外する
特定の文字列が含まれる行全体を除外したい場合、行の先頭に負の先読みを追加することができます。
以下の例では、「cat」を含む行を除外します。
const text = `The cat sat on the mat.
The dog barked.
The cat and dog played together.`;
const regex = /^(?!.*cat).+/gm;
const matches = text.match(regex);
console.log(matches); // ["The dog barked."]
このコードでは、^(?!.*cat)
が「cat」を含まない行を一致させています。
5. 文字列の一部を除外する
特定の文字列の一部を除外したい場合、部分一致を考慮する必要があります。
例えば、「cat」を含む単語を除外したい場合、以下のように記述します。
const text = "The cat sat on the mat. The catapult launched.";
const regex = /\b(?!cat)\w+\b/g;
const matches = text.match(regex);
console.log(matches); // ["The", "sat", "on", "the", "mat.", "The", "catapult", "launched."]
この例では、「cat」を含む単語は除外されず、他の単語が一致します。
6. まとめ
正規表現を使って特定の文字列を除外する方法は、負の先読みを活用することで実現できます。この記事で紹介したテクニックを使うことで、特定の文字列を除外したり、複数の条件を組み合わせたりすることが可能です。正規表現は強力なツールですが、使い方を理解することで、より効果的に活用できるようになります。