正規表現の「肯定先読み」とは
ツイートに書いた「拡張子なしのファイル名と拡張子とを分割する方法」についてはすでに解決しているものとして、ここでは「肯定先読み」についてフォローしておく。
僕自身、日々の業務で正規表現は割と利用しているつもりだったが、肯定先読みの存在はこのときまで知らなかった。実際にはこれ以外に「否定先読み」や「肯定戻り読み」「否定戻り読み」などもあるのだが、ここでは肯定先読みについてのみ述べることにする。
MSDN のドキュメントの「正規表現の構文」にはこう書かれている。
肯定先読みを実行する部分式です。pattern に一致する文字列が始まる位置にある検索文字列と一致します。一致した文字列は記憶されず、後で使用することはできません。たとえば "Windows (?=95|98|NT|2000)" は、"Windows 2000" の "Windows" には一致しますが、"Windows 3.1" の "Windows" には一致しません。先読み処理では、読み進まれた文字は処理済みとは見なされません。一致の検出後、次の検索処理は先読みされた文字列の後からではなく、一致文字列のすぐ後から開始されます。
この "Windows" を例にとった解説は直感的に分かりやすかった。 つまり、?=
に続くパターンが後に続く文字列の場合のみ一致するというわけか。"Windows" の例で言えば、(Windows95|Windows98|WindowsNT|Windows2000)
と同様の部分式になるわけだが、肯定先読みよりもこちらの冗長な部分式のほうが、個人的には分かりやすいですけどね。