朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
正規表現 グループ化とキャプチャについて





グループ化するときに括弧を使いますが、この括弧にはキャプチャ機能も付いています。
キャプチャ機能が付いている括弧をそのまま使ってもいいんじゃないのと思うかもしれませんが、動作に少なからずとも影響するそうです。
ですので、キャプチャの必要のないグループ化についてはキャプチャ機能のない括弧、(?:・・・)を使うとよいと思います。
また、キャプチャありの括弧を無駄に多く使うとサンプルの最初の結果を見ると、必要とする結果を取得するためのインデックスの計算が大変になります。
そこで便利なのが名前付きキャプチャです。
名前付きキャプチャは、(?<name>・・・)という感じで、nameの場所に使いたい名前を使います。
選択肢の場合は括弧でグループ化する必要がありますが、どのタイプの括弧を使うかは考えて使ってください。
ここで、.Netでは、グループ化した時の結果にアクセスするときに知っておかないといけない特徴があります。
MatchクラスのGroupsはインデクサでありますが、0番目は必ず正規表現がマッチしたテキストが入っています。
その次から各グループにインデックスでアクセスできます。
また、名前付きキャプチャについてはその名前を使ってアクセスできます。サンプルを参考にしていただきたいです。

C#

            //何でもかんでも括弧を使ってグループ化するとキャプチャが多くなる
            Regex r9 = new Regex("(\\s*)(https?)://([^/]+)(.*)/([^/]*)(\\s*)");
            MatchCollection m9 = r9.Matches(TEXT_URL);

            for (int i = 0; i < m9[0].Groups.Count; i++)
            {
                this.textBox1.Text += "m9(" + i.ToString() + "):" + m9[0].Groups[i].Value + "\r\n";
            }

            //キャプチャしたくないところは括弧を外したり、キャプチャなしの括弧を使う
            Regex r10 = new Regex("\\s*(https?)://([^/]+)(?:.*)/([^/]*)\\s*");
            MatchCollection m10 = r10.Matches(TEXT_URL);

            for (int i = 0; i < m10[0].Groups.Count; i++)
            {
                this.textBox1.Text += "m10(" + i.ToString() + "):" + m10[0].Groups[i].Value + "\r\n";
            }

            //名前付きキャプチャを使うとすっきりする
            Regex r11 = new Regex("\\s*(?https?)://(?[^/]+)(?:.*)/(?[^/]*)\\s*");
            MatchCollection m11 = r11.Matches(TEXT_URL);

            this.textBox1.Text += "m11(pro):" + m11[0].Groups["pro"].Value + "\r\n";
            this.textBox1.Text += "m11(domain):" + m11[0].Groups["domain"].Value + "\r\n";
            this.textBox1.Text += "m11(file):" + m11[0].Groups["file"].Value + "\r\n";

            //選択はグループ化必要だが・・・
            Regex r12 = new Regex("\\s*(?:https?)://(?:[^/]+)(?.net|.com|.info|.jp)(?:.*)/(?:[^/]*)\\s*");
            MatchCollection m12 = r12.Matches(TEXT_URL);

            this.textBox1.Text += "m12(domain):" + m12[0].Groups["domain"].Value + "\r\n";
/* 結果
m9(0):http://www.yoursite.net/d1/d2/sample.aspx
m9(1):
m9(2):http
m9(3):www.yoursite.net
m9(4):/d1/d2
m9(5):sample.aspx
m9(6):
m10(0):http://www.yoursite.net/d1/d2/sample.aspx
m10(1):http
m10(2):www.yoursite.net
m10(3):sample.aspx
m11(pro):http
m11(domain):www.yoursite.net
m11(file):sample.aspx
m12(domain):.net
*/

VB.NET

    Private TEXT_URL As String = "http://www.yoursite.net/d1/d2/sample.aspx"

        '何でもかんでも括弧を使ってグループ化するとキャプチャが多くなる
        'Dim r9 As Regex = New Regex("(\\s*)(https?)://([^/]+)(.*)/([^/]*)(\\s*)")
        Dim r9 As Regex = New Regex("(\s*)(https?)://([^/]+)(.*)/([^/]*)(\s*)")
        Dim m9 As MatchCollection = r9.Matches(TEXT_URL)

        For i As Integer = 0 To m9(0).Groups.Count - 1 Step 1

            Me.TextBox1.Text += "m9(" & i.ToString() & "):" & m9(0).Groups(i).Value & vbCrLf
        Next i

        'キャプチャしたくないところは括弧を外したり、キャプチャなしの括弧を使う
        Dim r10 As Regex = New Regex("(https?)://([^/]+)(?:.*)/([^/]*)")
        Dim m10 As MatchCollection = r10.Matches(TEXT_URL)

        For i As Integer = 0 To m10(0).Groups.Count - 1 Step 1

            Me.TextBox1.Text += "m10(" & i.ToString() & "):" & m10(0).Groups(i).Value & vbCrLf
        Next i

        '名前付きキャプチャを使うとすっきりする
        Dim r11 As Regex = New Regex("\s*(?https?)://(?[^/]+)(?:.*)/(?[^/]*)\s*")
        Dim m11 As MatchCollection = r11.Matches(TEXT_URL)

        Me.TextBox1.Text += "m11(pro):" & m11(0).Groups("pro").Value & vbCrLf
        Me.TextBox1.Text += "m11(domain):" & m11(0).Groups("domain").Value & vbCrLf
        Me.TextBox1.Text += "m11(file):" & m11(0).Groups("file").Value & vbCrLf

        '選択はグループ化必要だが・・・
        Dim r12 As Regex = New Regex("\s*(?:https?)://(?:[^/]+)(?.net|.com|.info|.jp)(?:.*)/(?:[^/]*)\s*")
        Dim m12 As MatchCollection = r12.Matches(TEXT_URL)

        Me.TextBox1.Text += "m12(domain):" & m12(0).Groups("domain").Value & vbCrLf

        '結果
        'm9(0):http://www.yoursite.net/d1/d2/sample.aspx
        'm9(1)
        'm9(2) : http
        'm9(3) : www.yoursite.net
        'm9(4):/d1/d2
        'm9(5) : sample.aspx
        'm9(6)
        'm10(0):http://www.yoursite.net/d1/d2/sample.aspx
        'm10(1) : http
        'm10(2) : www.yoursite.net
        'm10(3) : sample.aspx
        'm11(pro) : http
        'm11(domain) : www.yoursite.net
        'm11(file) : sample.aspx
        'm12(domain) : .net









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

投稿日時評価コメント