量指定子アンカー

今回のテーマ.

量指定子 文字列の長さを指定するもの.
アンカー 文字位置を指定するもの.

量指定子

量指定子 意味
+ 直前の要素1個以上の連続した文字列
* 直前の要素0個以上の連続した文字列
? 直前の要素0個あるいは1個
{n} 直前の要素 n個
{n,} 直前の要素n個以上
{n,m} 直前の要素n個以上m個以下
注意: ここで「直前の要素」というのは、一文字とは限らない。2文字以上ある場合もある。
正規表現 量指定子の直前の要素 マッチするもの(orは含まない)
needs? s need or needs
implement(ed)? ed implement or implemented
a{3} a aaa
a{2,} a aa or aaa or aaaa or aaaaa or ...
a{2,3} a aa or aaa
(ab){2} ab abab
[0-9]{3} [0-9] 123 or 111 or 235 など3文字の数字。
\w{3} \w add or りんご or ゴリラ など3文字の単語。

アンカー

アンカーというのは、文字列ではなく文字位置にマッチする。

\b 単語境界(\wとそれ以外の境界) 単語が先頭、終端にあるときに注意!
\B 単語境界以外
^ 先頭 (モードにより変化)
$ 末尾(モードにより変化)
\A テキスト全体の先頭
\z テキスト全体の終端

アンカーは正規表現の構成要素の一つとして用いられることが多いが、 単独で使用することもできる。その際、マッチする文字列は、長さ0の文字列になるので、 意味があるのは、マッチした「位置」になる。

0 1 2 3 4 5 6 7 8
A n a p p l e .

例. 長さ9の文字列 "An apple."に対して、次の表のアンカーを単独で使用して得られる結果。

アンカー マッチする位置
^ 0
$ 9 (ピリオドの後)
\b 0, 2, 3, 8
\B 1,4,5,6,7,9
\A 0
\z 9

コード例(アンカー\bの結果)

string text = "An apple.";
foreach (Match item in Regex.Matches(text, @"\b")){
        Console.WriteLine(item.Index);
}
    
実行結果.
0
2
3
8

Note. アンカーの「\b」は単語境界から見て右側にあるインデックスにマッチする。

応用例

例題1. string text = "I will do my best." から2文字の単語を取得せよ。

解答.

string text = "I will do my best.";
string pattern = @"\b\w{2}\b";
foreach (Match item in Regex.Matches(text,pattern)){
    Console.WriteLine(item.Value);
}

実行結果.
do
my

例題2. string text = "I will do my best." に対して、各単語を縦棒(|)で分離せよ。

解答.

string text = "I will do my best.";
string pattern = @"\b";
Console.WriteLine(Regex.Replace(text,pattern,"|"));

実行結果.
|I| |will| |do| |my| |best|.

Note. このようにアンカーに対して Replace を適用するとマッチした位置に、指定した文字列が挿入される。