1. 概要

このチュートリアルでは、テキストを操作するときに正規表現を使用しないようにする必要がある場合について説明します。

この記事の終わりに、これらのケースを特定し、正規表現の代わりに使用するツールを知ることができます。

2. HTMLまたはXMLを使用する場合

正規表現は、形式言語を操作するための強力なツールです。 ただし、マークアップ言語など、正式ではない言語を使用する場合は役に立ちません。

正規表現を使用する際のよくある間違いは、正規表現を使用してHTMLおよびXMLを解析しようとすることです。 私たち自身が管理しているXMLリポジトリから発信されたものなど、事前に予測できる構造を持つファイルを除いて、これらの試みは必ず失敗します。

これは、HTMLおよびXMLファイルのツリー構造では、マークアップタグのすべての開閉を追跡するために正規表現が必要なためです。 さらに、マークアップタグを含むツリーの検索スペースは任意に大きく、これは2つのことを意味します。

  • 有限の正規表現には、いくつかの可能な木の枝は含まれません
  • 正規表現の複雑さは、解析されているマークアップツリーのブランチの数よりも速く増加します

したがって、HTMLまたはXMLを使用する場合は、正規表現の代わりにHTMLまたはXMLパーサーを使用する必要があります。

3. 単純な検索がうまく機能する場合

単純な検索で問題自体に簡単に取り組むことができる場合、正規表現を使用して問題を誤って解決しようとすることがあります。

家の壁に使用されているペンキの色を探していると想像してみましょう。

壁が持つ可能性のある色のいずれかに一致する正規表現を作成することを試みることができます。

「(gr(a | e)y|白|黒|青|赤|緑|…)」

または、検索機能を使用して「色」という単語を見つけ、この単語の近くに示されている特定の色を読み取ることもできます。

このタスクに正規表現を使用した場合、数式を適用するよりも数式の作成に多くの時間を費やすことになります。 この場合、RegExesの使用は保証されません。

この問題は、色の名前だけでなく、求められている情報がテキスト内で1回だけ発生するほとんどのタスクの特徴です。 結果として、それは実際に非常に一般的に遭遇する問題です。 簡単な検索で問題を解決できる場合は、正規表現の使用を避ける必要があります。

4. 敵対的な状況にあるとき

別のケースでは、ユーザーの行動を打ち切るために正規表現を使用します。 プログラマーとユーザーベースの間のこの種の相互作用は、敵対的な性格を帯びることがあります。 これは、たとえば、スパムフィルター冒とく的な表現のフィルター、またはシャドウ禁止のシステムを構築している場合です。

このコンテキストでは、正規表現を使用してフィルターをブートストラップすることができますが、ユーザーが最終的にフィルターの動作を学習し、それを回避しようとすることを期待する必要があります。

車が嫌いな自転車愛好家向けのウェブサイトがあると想像してみてください。

一般的な文字の置換を含めることで、RegExesで「車」について話しているコメントを識別してフィルタリングすることを考えるかもしれません。

「c(a | 4)r」

ただし、ユーザーは、「自動車」や「四輪の物」など、人間には理解できるがフィルターでは認識できない複合表現を使用して、フィルターを通過することができます。

5. ブール正規表現がFalseと評価される場合

最後の1つのケースは、ブール演算を含む正規表現の使用に関するものです。 ブール代数の基本法則に関する記事で説明したように、ブール式を単純化してアルゴリズムによる評価を可能にする方法があります。

RegExesの標準実装には、および演算子がありません。 ただし、または演算子「|」があります否定先読み演算子「?!」。 これは、ドモルガンの法則を使用して、論理演算子およびと同等の式を作成できることを意味します。

「(?![^ P] | [^ Q])」

この式では、大文字と、などの任意の文字セットを置き換えることができます。

したがって、ブール演算子を使用するRegExが一連のブール演算子を使用する場合、常にfalseと評価される単純化が存在する可能性があります。 この場合、正規表現は一致しないため、その使用は保証されません。

これは、RegExes内でブール演算を使用する場合、少なくともいくつかの値について数式が実際にtrueと評価されることを確認する必要があることも意味します。

6. 結論

このチュートリアルでは、正規表現を使用すべきでない一般的なケースをいくつか検討しました。