翻訳者から
これは昨日Lea Verouによって書かれた小さなメモの翻訳であり、毎日のタスクを解決するための、新しいものではないが興味深い技術を提案しています。
この記事の情報はECMAScriptに関するものですが、他のRegExpエンジンでも使用できます(ただし、より適切なソリューションがある可能性があります)。
例が複雑に思える場合は、コンソールを読みながら再生することをお勧めします。 そして恐ろしいタイトルを読んだことを前もって許します。
記事
しばらく正規表現を使用する場合は、次のタスクのさまざまなバリエーションに遭遇している必要があります。
- 交差点 :「パターンAとパターンBに一致するもの」
例: パスワード、少なくとも6文字、少なくとも1つの数字、少なくとも1つの文字、および少なくとも1つの特殊文字
- 例外 :「パターンAに一致するが、パターンBには一致しないものが必要」
例: 50で割り切れない整数
- 拒否 :すべて。 パターンAと一致しないもの
例: 「Foo」という単語を含まない文字列
ECMAScriptにはサーカムフレックス(^)がありますが、文字セットを除外するために、より複雑なものを除外する機会はありません。
さらに、「OR」を示す縦線(|)がありますが、「AND」を意味するものはなく、「EXCEPT」(例外)を意味するものはありません。 これらのすべてのアクションは、文字クラスを使用して単純な文字セットで実行できますが、複雑なシーケンスでは機能しません。
ただし、主要なチェックは文字をキャプチャせず、検索位置をシフトしないという事実を利用して、3つの操作すべてをシミュレートできます。 単純にさらに一致を検索し続けることができ、必要な部分文字列と一致します。これは、先行チェックでは何もキャプチャされないためです...
例外
簡単な例として、式
上記の問題の解決策は次のとおりです
交差点
交差点(I)については、いくつかの肯定的な先行チェックを単純にチェーンし、最後のテンプレートで必要な行を取得できます(先行チェックのみを残す場合、正しい答えが得られますが、間違った一致を得ることができます)。 たとえば、上記のパスワードに関する問題の解決策は次のとおりです
Internet Explorerバージョン8以前で正規表現を機能させる場合は、 このエラーについて知って、それに応じて正規表現を変更することが重要です
否認
拒否は最も簡単なことです。 負の先行条件と
おわりに
この手法にはいくつかの困難があります。 これは主に結果としてキャプチャされるものが原因です。 (リーディングチェック以外のキャプチャパターンが必要な文字列全体をキャプチャすることを確認してください)
Steven Levithanはさらに深く掘り下げ、 条件演算子とアトミックグループを模倣しようとします 。 脳にさようなら。
ボーナスリンクカップル
パーツ内の正規表現を解析して説明するユーティリティ
JSライブラリ 。正規表現を使用した作業を大幅に促進し、それらに機能を追加します。