朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
正規表現 先読みと後読み





タイプ正規表現意味
肯定先読み(?=・・・)右側が正規表現にマッチする
否定先読み(?!・・・)右側が正規表現にマッチしない
肯定後読み(?<=・・・)左側が正規表現にマッチする
否定後読み(?<!・・・)左側が正規表現にマッチしない

先後読みは上の表のとおりなのですが、肯定後読みならばその位置で左側に正規表現にマッチするのが条件であり、否定先読みならばその位置で右側に正規表現にマッチしないのが条件になります。
ここで注意しないといけないのが、固定の長さの文字列の条件なら良いのですが、可変の長さの文字列が条件ですとパフォーマンスに影響が出ます。
例えば、(?<=\w*)なんてのがあると、その位置にくるたびに肯定後読みがチェックされるのですが、どこまでも進んでいく(\w*なので)のでパフォーマンスに影響が出ます。

C#

            //2の左側が(数字カンマ)か(数字)で、右側が(カンマ)ならマッチする正規表現
            Regex r14 = new Regex("(?<=\\d,?)(2)(?=,)");
            MatchCollection m14 = r14.Matches("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22");
            
            foreach (Match m in m14)
            {
                this.textBox1.Text += "m14:" + m.Groups[1].Value + "\r\n";
                this.textBox1.Text += m.Index + "\r\n";
            }
/*結果
m14:2
4
m14:2
27
*/

VB.NET

        '2の左側が(数字カンマ)か(数字)で、右側が(カンマ)ならマッチする正規表現
        Dim r14 As Regex = New Regex("(?<=\d,?)(2)(?=,)")
        Dim m14 As MatchCollection = r14.Matches("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22")

        For Each m As Match In m14

            Me.TextBox1.Text += "m14:" & m.Groups(1).Value & vbCrLf
            Me.textBox1.Text += m.Index & vbCrLf;
        Next

'結果
'm14:2
'4
'm14:2
'27








良いやや良い普通やや悪い悪い

投稿日時評価コメント