パターンマッチの条件には含めたいが、マッチ範囲に含めたくない場合の正規表現式 (肯定先読みの利用)

パターンマッチの条件には含めたいが、マッチ範囲に含めたくない場合の正規表現式を紹介します。

概要

正規表現でパターンにマッチさせた際に、パターンの中の一部のパターン部分に対してマッチさせたい場合があります。
この場合は「肯定先読み」を利用すると実装できます。

肯定先読みの書式

(?=パターン)
?= を記述します。

通常は、ブロックの前に式がおかれるため、次の形式となります。
パターン(?=パターン)

肯定後読みとの違い
肯定後読みは、(?<=...)ブロックの後ろに式があり、肯定後読みのパターンにマッチし、さらに後に続く式にもマッチした場合に肯定後読みブロック以降部分がマッチと判定されます。
(?=パターン)

例1

Wikipedia の文字列にマッチさせたいですが、マッチさせる範囲は、Wiki 部分のみとしたいです。 この場合の正規表現式は次の通りです。
Wiki(?=pedia)

実行結果

置換文字列を"Web"とした場合、次の結果になります。 Wikipediaの文字列にマッチした場合でも、マッチの範囲は Wiki 部分になり、WikiがWebに置換されていることが確認できます。
文字列マッチするか置換後の文字列
WikiWiki×WikiWiki
Wiki×Wiki
Wiiiki×Wiiiki
WikipediaWebpedia
BigWikipedia2BigWebpedia2
Wikipepe×Wikipepe
OhWikipedia!!×OhWebpedia!!
ArohaWikipen×ArohaWikipen

例2

ponta の文字列にマッチさせたいですが、マッチさせる範囲は、pon 部分のみとしたいです。 この場合の正規表現式は次の通りです。
pon(?=ta)

実行結果

実行結果

置換文字列を"OK"とした場合、次の結果になります。 pontaの文字列にマッチした場合でも、マッチの範囲は pon 部分になります。
文字列マッチするか置換後の文字列
penta×penta
pontaOKta
pnta×pnta
printa×printa
poronta×poronta
zpontazOKta
3ponta!!3OKta
anapontap×anaOKtap
petita×petita
ota×ota
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-08-19
作成日: 2022-05-05
iPentec all rights reserverd.