先読みと後読み

今回は正規表現の中でも高度な機能である「先読み」と「後読み」につい て調べる。 文字「位置」にマッチするものをアンカーと呼ぶならば、これら「先読み と後読み」はアンカーである。 通常のアンカーと同様に単独の使用もできるが、他の正規表現と組み合わ せて使用することも多い。

先読み

pattern を正規表現としたとき 先読みを表す正規表現は (?=pattern) となり、 これは patternがマッチする「開始位置」 にマッチする。

text ="abc cbab"

に正規表現(?=ab)を適用するとマッチする インデックスは「0と6」になる。

0 1 2 3 4 5 6 7
a b c c b a b

正規表現 \d+(?=cm) を text ="23cm 2px 310cm" に適用すると、「23と310」がマッチする。

0 1 2 3 4 5 6 7 8 9 10 11 12 13
2 3 c m 2 p x 3 1 0 c m

確認するコード例.

string text = "23cm 2px 310cm";
string pattern = @"\d+(?=cm)";
var matches = Regex.Matches(text, pattern);
foreach (Match item in matches)
{
    Console.WriteLine(item.Value);
}
実行結果.
23
310

後読み

pattern を正規表現としたとき 後読みを表す正規表現は (?<=pattern) と なり、 これは patternにマッチする文字列の終端文字の次の位 置 にマッチする。

text ="abc cbab"

に正規表現(?<=ab)を適用するとマッチするインデックスは「2と8」になる。

0 1 2 3 4 5 6 7 8
a b c c b a b

正規表現 (?<=0x)\d+ を text ="0x231 0b1 0x31" に適用すると、「231と31」がマッチする。

0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x 2 3 1 0 b 1 0 x 3 1

確認するコード例.

string text = "23cm 2px 310cm";
string pattern = @"\d+(?=cm)";
var matches = Regex.Matches(text, pattern);
foreach (Match item in matches)
{
    Console.WriteLine(item.Value);
}
実行結果.
231
31

補足. インデックスの「2,12」は後読み(?<=0x)がマッチする位置。
上の正規表現(?<=0x)\d+は、この位置から開始 する連続する数値を取得するという意味になる。 結果的に左側に「0x」がついている数値を取得することになる。