高度な正規表現のパワーを解き放つ
正規表現 (regex) は、パターン マッチングとテキスト操作のための強力なツールを提供します。この記事では、複雑なテキスト処理タスクを正確かつ効率的に処理できるようにする高度な regex の概念について説明します。
先読みと後読みのアサーション
先読みアサーションと後読みアサーションを使用すると、パターンの前後に別のパターンがある場合にのみ、そのパターンを一致させることができます。一致に含めずにコンテキストを確認するのに役立ちます。
- 肯定先読み
(?=...)
: 指定された式が続く場合にのみパターンが一致するようにします。 - 否定先読み
(?!...)
: 指定された式が後に続かない場合にのみ、パターンが一致するようにします。 - 肯定的な後読み
(?<=...)
: 指定された式が先行する場合にのみパターンが一致するようにします。 - 否定の後読み
(?<!...)
: 指定された式が先行していない場合にのみパターンが一致するようにします。
例:
(?<=Mr\.\s|Mrs\.\s)[A-Z]\w+
この正規表現は、先頭に "Mr." または "Mrs." が付く名前に一致します。
条件付きパターン
条件付きパターンを使用すると、特定の条件が満たされているかどうかに基づいて、さまざまなパターンを一致させることができます。構文は (?(condition)true-pattern|false-pattern)
です。
例:
(\d{3}-)?(?(1)\d{3}-\d{4}|\d{7})
この正規表現は、市外局番の有無にかかわらず電話番号に一致します。
サブルーチンと再帰
サブルーチンと再帰を使用すると、同じ正規表現内でパターンを再利用したり、ネストされた構造を一致させたりすることができます。これは、複雑でネストされたデータの場合に特に便利です。
例:
(?<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));
}
結論
後読みアサーション、条件パターン、サブルーチン、再帰、絶対量指定子などの高度な正規表現テクニックにより、複雑なテキスト処理に対する正規表現の機能が拡張されます。これらの概念を習得すると、高度なマッチングおよび操作タスクを効率と精度を高めて処理できるようになります。