複雑な正規表現をマスターする

正規表現 (regex) は、パターン マッチングやテキスト操作に使用できる多目的ツールです。このチュートリアルでは、複雑なテキスト処理シナリオをより効率的に管理するのに役立つ高度な regex テクニックについて説明します。

後読みアサーション

後読みアサーションを使用すると、パターンの前に別のパターンがある場合にのみ、そのパターンを一致させることができます。これは、一致に含めずにコンテキストを保証するのに役立ちます。

  • 肯定的な後読み (?<=...): 指定された式が先行する場合にのみパターンと一致します。
  • 否定の後読み (?<!...): 指定された式が先行していない場合にのみパターンと一致します。

例:

(?<=Mr\.|Mrs\.)\s[A-Z]\w+

この正規表現は、先頭に "Mr." または "Mrs." が付く名前に一致します。

条件付きパターン

条件付きパターンを使用すると、特定の条件が満たされているかどうかに基づいて、さまざまなパターンを一致させることができます。構文は (?(condition)true-pattern|false-pattern) です。

例:

(\d{3}-)?\d{3}-\d{4}

この正規表現は、市外局番の有無にかかわらず電話番号に一致します。

サブルーチンと再帰

サブルーチンと再帰を使用すると、同じ正規表現内でパターンを再利用したり、ネストされた構造を一致させたりすることができます。これは、複雑でネストされたデータの場合に特に便利です。

例:

(?<group>\((?>[^()]+|(?&group))*\))

この正規表現は、ネストされたレベルのバランスの取れた括弧と一致します。

所有格量指定子

強欲な量指定子は正規表現エンジンによるバックトラックを防ぐため、バックトラックが発生しないようにしたい場合にパフォーマンスを向上させることができます。

例:

\w++

この正規表現は、単語の文字のシーケンスを所有的に一致させます。つまり、一致した文字は放棄されません。

フラグを使用したマッチングの強化

正規表現フラグはパターン マッチングの動作を変更します。一般的なフラグには次のようなものがあります。

  • 'i': 大文字と小文字を区別しない一致。
  • 'm': マルチラインモード。^$ の動作に影響します。
  • 's': Dotall モードでは、. が改行文字と一致します。
  • 'x': 読みやすくするために、空白を無視し、パターン内のコメントを許可します。

例:

/pattern/imsx

このパターンは、大文字と小文字を区別しない、複数行、ドットオール、拡張モードを適用します。

プログラミング言語の例

Python と JavaScript で高度な正規表現を使用する例をいくつか示します。

Pythonの例

import re

# Match a name preceded by Mr. or Mrs.
pattern = r'(?<=Mr\.|Mrs\.)\s[A-Z]\w+'
text = 'Mr. Smith and Mrs. Johnson'
matches = re.findall(pattern, text)

for match in matches:
    print('Match found:', match)

JavaScript の例

// Match a name preceded by Mr. or Mrs.
const pattern = /(?<=Mr\.|Mrs\.)\s[A-Z]\w+/g;
const text = 'Mr. Smith and Mrs. Johnson';
const matches = text.match(pattern);

if (matches) {
    matches.forEach(match => console.log('Match found:', match));
}

結論

後読みアサーション、条件パターン、サブルーチン、再帰、絶対量指定子などの高度な正規表現テクニックにより、複雑なテキスト処理に対する正規表現の機能が拡張されます。これらの概念を習得すると、高度なマッチングおよび操作タスクを効率と精度を高めて処理できるようになります。