ECMAScriptの正規表現で、先行チェックを使用して、交差、除外、減算をシミュレートします

翻訳者から



これは昨日Lea Verouによって書かれた小さなメモの翻訳であり、毎日のタスクを解決するための、新しいものではないが興味深い技術を提案しています。



この記事の情報はECMAScriptに関するものですが、他のRegExpエンジンでも使用できます(ただし、より適切なソリューションがある可能性があります)。



例が複雑に思える場合は、コンソールを読みながら再生することをお勧めします。 そして恐ろしいタイトルを読んだことを前もって許します。



記事



しばらく正規表現を使用する場合は、次のタスクのさまざまなバリエーションに遭遇している必要があります。







ECMAScriptにはサーカムフレックス(^)がありますが、文字セットを除外するために、より複雑なものを除外する機会はありません。



さらに、「OR」を示す縦線(|)がありますが、「AND」を意味するものはなく、「EXCEPT」(例外)を意味するものはありません。 これらのすべてのアクションは、文字クラスを使用して単純な文字セットで実行できますが、複雑なシーケンスでは機能しません。



ただし、主要なチェックは文字をキャプチャせず、検索位置をシフトしないという事実を利用して、3つの操作すべてをシミュレートできます。 単純にさらに一致を検索し続けることができ、必要な部分文字列と一致します。これは、先行チェックでは何もキャプチャされないためです...



例外



簡単な例として、式/ ^(?!meow)\ w {3} $ /は、「meow」という単語を含まない3文字の単語をキャプチャします。 これは簡単な例外です。



上記の問題の解決策は次のとおりです。/ ^(?!\ D + [50] 0)\ d {3} $ /



交差点



交差点(I)については、いくつかの肯定的な先行チェックを単純にチェーンし、最後のテンプレートで必要な行を取得できます(先行チェックのみを残す場合、正しい答えが得られますが、間違った一致を得ることができます)。 たとえば、上記のパスワードに関する問題の解決策は次のとおりです。/^(?=.*\d)(?=.*[az†)(?=.*[\W_{).{6,►$/ i
Internet Explorerバージョン8以前で正規表現を機能させる場合は、 このエラーについて知って、それに応じて正規表現を変更することが重要です


否認



拒否は最も簡単なことです。 負の先行条件と。+テストに合格した部分文字列をキャプチャする必要があります。 たとえば、上で提案した問題の解決策は次のようになります: /^(?!.*foo).+$/。 ただし、リスト全体から否定がそれほど有用ではないことを認めることは事実です。





おわりに



この手法にはいくつかの困難があります。 これは主に結果としてキャプチャされるものが原因です。 (リーディングチェック以外のキャプチャパターンが必要な文字列全体をキャプチャすることを確認してください)



Steven Levithanはさらに深く掘り下げ、 条件演算子アトミックグループを模倣しようとします 。 脳にさようなら。





ボーナスリンクカップル



パーツ内の正規表現を解析して説明するユーティリティ

JSライブラリ 。正規表現を使用した作業を大幅に促進し、それらに機能を追加します。






All Articles