グループ化構成体
更新 : 2007 年 11 月
グループ化構成体は、正規表現の部分式を表し、通常は入力文字列の部分文字列をキャプチャします。正規表現グループ化構成体の説明を次の表に示します。
グループ化構成体 |
説明 |
---|---|
(subexpression) |
一致した部分式 (またはキャプチャしないグループ。詳細については「正規表現のオプション」の ExplicitCapture オプションの説明を参照してください) をキャプチャします。() を使用するキャプチャには、左かっこの順番に基づいて自動的に 1 から始まる番号が付けられます。キャプチャ要素番号がゼロになる最初のキャプチャは、正規表現パターン全体と一致するテキストです。 |
(?<name>subexpression) |
一致した部分式をグループ名または番号名にキャプチャします。name に使用する文字列は、区切り記号を含まず、先頭が数字以外である必要があります。たとえば (?'name') のように、山かっこの代わりに一重引用符を使用することもできます。 |
(?<name1-name2>subexpression) |
グループ定義を均等化します。既に定義されていたグループ name2 の定義を削除し、既に定義されていた name2 グループと現在のグループの間隔をグループ name1 に格納します。グループ name2 が定義されていない場合、一致はバックトラックされます。name2 の最後の定義を削除すると、name2 の以前の定義がわかるため、この構成体によって、かっこなど入れ子になった構成体を追跡するカウンタとして name2 グループのキャプチャのスタックを使用できます。この構成体では、name1 は省略できます。たとえば (?'name1-name2') のように、山かっこの代わりに一重引用符を使用することもできます。 詳細については、このトピックの「例」を参照してください。 |
(?:subexpression) |
キャプチャしないグループです。部分式と一致した部分文字列をキャプチャしません。 |
(?imnsx-imnsx:subexpression) |
指定したオプションを部分式に適用または無効にします。たとえば、(?i-s: ) によって、大文字小文字の区別が有効になり単一行モードが無効になります。詳細については、「正規表現のオプション」を参照してください。 |
(?=subexpression) |
ゼロ幅の正の先読みアサーションです。部分式がこの位置の右で一致した場合にだけ照合を継続します。たとえば、\w+(?=\d) は、単語に数字が続いている場合に一致します。数字とは一致しません。この構成体はバックトラックしません。 |
(?!subexpression) |
ゼロ幅の負の先読みアサーションです。部分式がこの位置の右で一致しない場合にだけ照合を継続します。たとえば、\b(?!un)\w+\b は、先頭が un でない単語と一致します。 |
(?<=subexpression) |
ゼロ幅の正の後読みアサーションです。部分式がこの位置の左で一致した場合にだけ照合を継続します。たとえば、(?<=19)99 は、19 に続く 99 のインスタンスと一致します。この構成体はバックトラックしません。 |
(?<!subexpression) |
ゼロ幅の負の後読みアサーションです。部分式がこの位置の左で一致しない場合にだけ照合を継続します。 |
(?>subexpression) |
非バックトラッキング部分式です。"最長" 部分式とも呼ばれます。部分式は 1 回完全に一致し、バックトラッキングの断片には参加しません。つまり、部分式は、その部分式単独で一致する文字列にだけ一致します。 既定では、一致しなかった場合に、バックトラッキングによって他の一致が検索されます。バックトラッキングが成功しないことがわかっている場合は、非バックトラッキング部分式を使用して不要な検索を回避し、パフォーマンスを高めることができます。 |
名前付きキャプチャは、左から右へ左かっこの順に連番で番号付けされます。これは、名前のないキャプチャと同じです。ただし、名前付きキャプチャは、名前のないすべてのキャプチャがカウントされた後で番号付けされます。たとえば、パターン ((?<One>abc)\d+)?(?<Two>xyz)(.*) からは、次のように番号と名前の付いたキャプチャ グループが作成されます。最初のキャプチャ (番号 0) は、常にパターン全体を指します。
数値 |
名前 |
パターン |
---|---|---|
0 |
0 (既定名) |
((?<One>abc)\d+)?(?<Two>xyz)(.*) |
1 |
1 (既定名) |
((?<One>abc)\d+) |
2 |
2 (既定名) |
(.*) |
3 |
One |
(?<One>abc) |
4 |
Two |
(?<Two>xyz) |
グループ定義を均等化する例
次のコード例では、グループ定義の均等化を使用して、入力文字列内の左と右の山かっこ (<>) を一致させています。この例の Open グループと Close グループのキャプチャ コレクションは、一致する山かっこのペアを追跡するスタックのように使用されます。つまり、キャプチャされた各左山かっこは Open グループのキャプチャ コレクションに挿入され、キャプチャされた各右山かっこは Close グループのキャプチャ コレクションに挿入されます。さらに、グループ定義の均等化によって、各左山かっこに一致する右山かっこが存在することが確認されます。
' This code example demonstrates using the balancing group definition feature of
' regular expressions to match balanced left angle bracket (<) and right angle
' bracket (>) characters in a string.
Imports System
Imports System.Text.RegularExpressions
Class Sample
Public Shared Sub Main()
'
' The following expression matches all balanced left and right angle brackets(<>).
' The expression:
' 1) Matches and discards zero or more non-angle bracket characters.
' 2) Matches zero or more of:
' 2a) One or more of:
' 2a1) A group named "Open" that matches a left angle bracket, followed by zero
' or more non-angle bracket characters.
' "Open" essentially counts the number of left angle brackets.
' 2b) One or more of:
' 2b1) A balancing group named "Close" that matches a right angle bracket,
' followed by zero or more non-angle bracket characters.
' "Close" essentially counts the number of right angle brackets.
' 3) If the "Open" group contains an unaccounted for left angle bracket, the
' entire regular expression fails.
'
Dim pattern As String = "^[^<>]*" & _
"(" + "((?'Open'<)[^<>]*)+" & _
"((?'Close-Open'>)[^<>]*)+" + ")*" & _
"(?(Open)(?!))$"
Dim input As String = "<abc><mno<xyz>>"
'
Dim m As Match = Regex.Match(input, pattern)
If m.Success = True Then
Console.WriteLine("Input: ""{0}"" " & vbCrLf & "Match: ""{1}""", _
input, m)
Else
Console.WriteLine("Match failed.")
End If
End Sub 'Main
End Class 'Sample
'This code example produces the following results:
'
'Input: "<abc><mno<xyz>>"
'Match: "<abc><mno<xyz>>"
'
// This code example demonstrates using the balancing group definition feature of
// regular expressions to match balanced left angle bracket (<) and right angle
// bracket (>) characters in a string.
using System;
using System.Text.RegularExpressions;
class Sample
{
public static void Main()
{
/*
The following expression matches all balanced left and right angle brackets(<>).
The expression:
1) Matches and discards zero or more non-angle bracket characters.
2) Matches zero or more of:
2a) One or more of:
2a1) A group named "Open" that matches a left angle bracket, followed by zero
or more non-angle bracket characters.
"Open" essentially counts the number of left angle brackets.
2b) One or more of:
2b1) A balancing group named "Close" that matches a right angle bracket,
followed by zero or more non-angle bracket characters.
"Close" essentially counts the number of right angle brackets.
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
*/
string pattern = "^[^<>]*" +
"(" +
"((?'Open'<)[^<>]*)+" +
"((?'Close-Open'>)[^<>]*)+" +
")*" +
"(?(Open)(?!))$";
string input = "<abc><mno<xyz>>";
//
Match m = Regex.Match(input, pattern);
if (m.Success == true)
Console.WriteLine("Input: \"{0}\" \nMatch: \"{1}\"", input, m);
else
Console.WriteLine("Match failed.");
}
}
/*
This code example produces the following results:
Input: "<abc><mno<xyz>>"
Match: "<abc><mno<xyz>>"
*/