2019/12/01vimregexpスパルタン正規表現とも言える、基礎から解説する正規表現です。正規表現はVimに限らずコンピューター上でのテキスト操作において非常に強力です。学習の難しさも非情で多くのIT技術者、Vimmerが正規表現に苦しんでいるのを幾度となく目の当たりにしています。正規表現は本当にそんなに難しいのでしょうか。いいえそんなことはありません。正規表現は本来とても簡単な原理で学習も容易なのです。関わらず難しいと思われてしまうのは、原理を理解しないまま外見上の機能をそのまま覚えようとするからです。本記事では正規表現の原理にフォーカスし解説することで、Vimを含む様々な正規表現実装の利用難度を適切にしようという記事です。「正規表現」はもともと形式言語という言語学の一分野の研究から生まれました。言語学というのは言葉を科学的に研究する学問です。形式言語はその中でも形式的な言語、構文などの定義が明確で曖昧さのない言語を指しています。正規表現は正規言語という形式言語に分類される言語を表すために考え出されました。正規言語の特徴を簡単に言うと「決定性有限オートマトンによって受理可能」ということになります。決定性有限オートマトンは省略してDFAと表記されることがあるので、以下ではDFAと書きましょう。「DFAによって受理可能」とは「非決定性オートマトンによって受理可能」ともいえます。非決定性オートマトンも長いですし省略してNFAと表記されますので以下ではNFAと書きましょう。本来この関係は逆で「NFAならDFA」なのですが、ここでは無視します。(有限オートマトンについての簡単な説明を補足しておきました)ところでNFAってVimmerには見覚えあるかもしれません。Vimの新しい正規表現エンジンはNFAエンジンです。あらゆるNFAはDFAに変換可能です。故にNFAは正規言語を受理可能といえます。いうことで実際にVimはNFAで正規表現エンジンを実装しています。正規表現でどのようなパターンマッチを行えるか、何ができないかを決定しています。「無限にネストするXMLタグを考慮したパターンマッチ」は本来の正規表現では決してできません。DFAのFの部分の「有限」が無限にネストしうる言語を表現できなくしています。ちなみに「プッシュダウンオートマトン」を用いれば容易に実現可能です。「有限」という制限を克服しています。DFAでも十分に行えるということになります。組にマッチする正規表現」を示します。この例の正規表現の中の空白は見やすくするためのものなので無視してください。)1段の正規表現を分解して解説すると次のようになります。終わる2段の正規表現を同様に分解して解説すると次のようになります。同じになってることに気がつくでしょう。1段の1から3を入れ子にすることで導き出せます。正規表現で十分に書けることを示しました。正規表現のできることを正確に理解し注意深く構築したものです。大事なのは正規表現のできることを理解するその1点に尽きます。正規表現が受理する正規言語の定義とはなんでしょう。正規言語は形式言語の1つですから厳密な定義があります。ウィキペディアから引用してみます。