次のテキスト入力dogcatcatcat
と次のようなパターンがあるとします。dog(cat(catcat))
この場合、3つのグループがあり、最初のグループ(メジャーグループ)が一致に対応します。
== dogcatcatcat
およびGroup0 ==に一致dogcatcatcat
グループ1 == catcatcat
グループ2 == catcat
それで、それは一体何なのでしょう?
Regex
クラスを使用してC#(.NET)で書かれた小さな例を考えてみましょう。
int matchIndex = 0;
int groupIndex = 0;
int captureIndex = 0;
foreach (Match match in Regex.Matches(
"dogcatabcdefghidogcatkjlmnopqr", // input
@"(dog(cat(...)(...)(...)))") // pattern
)
{
Console.Out.WriteLine($"match{matchIndex++} = {match}");
foreach (Group @group in match.Groups)
{
Console.Out.WriteLine($"\tgroup{groupIndex++} = {@group}");
foreach (Capture capture in @group.Captures)
{
Console.Out.WriteLine($"\t\tcapture{captureIndex++} = {capture}");
}
captureIndex = 0;
}
groupIndex = 0;
Console.Out.WriteLine();
}
出力:
match0 = dogcatabcdefghi
group0 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group1 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group2 = catabcdefghi
capture0 = catabcdefghi
group3 = abc
capture0 = abc
group4 = def
capture0 = def
group5 = ghi
capture0 = ghi
match1 = dogcatkjlmnopqr
group0 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group1 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group2 = catkjlmnopqr
capture0 = catkjlmnopqr
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
最初の一致(match0
)だけを分析しましょう。
あなたが見ることができるように3つのがあるマイナーなグループは:group3
、group4
およびgroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
これらのグループ(3〜5)は、メインパターンの「サブパターン」のために作成されました(...)(...)(...)
(dog(cat(...)(...)(...)))
の値はgroup3
そのキャプチャに対応します(capture0
)。(group4
およびの場合と同様group5
)。のようなグループの繰り返しがないため(...){3}
です。
では、グループの繰り返しがある別の例を考えてみましょう。
我々はから(コード上に示すために)一致する正規表現パターンを変更する場合(dog(cat(...)(...)(...)))
に(dog(cat(...){3}))
は、次があることに気づくでしょうグループ繰り返し:(...){3}
。
これで出力が変更されました:
match0 = dogcatabcdefghi
group0 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group1 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group2 = catabcdefghi
capture0 = catabcdefghi
group3 = ghi
capture0 = abc
capture1 = def
capture2 = ghi
match1 = dogcatkjlmnopqr
group0 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group1 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group2 = catkjlmnopqr
capture0 = catkjlmnopqr
group3 = pqr
capture0 = kjl
capture1 = mno
capture2 = pqr
ここでも、最初の一致(match0
)のみを分析します。
そこにはより多くのないマイナーグループは group4
及びgroup5
ための(...){3}
反復({n}は、前記N> = 2、それらが一つの群に併合してきました)group3
。
この場合、group3
値はそれcapture2
(つまり、最後のキャプチャ)に対応します。
あなたはすべての3つのインナーキャプチャを(必要な場合はこのようにcapture0
、capture1
、capture2
)あなたは、グループの一巡する必要がありますCaptures
コレクション。
結論としては、パターンのグループを設計する方法に注意してください。あなたのような、グループの仕様を引き起こすもの振る舞い先行考えなければならない(...)(...)
、(...){2}
または(.{3}){2}
など
うまくいけば、Captures、Groups、Matchesの違いを明らかにするのにも役立ちます。
a functionality that won't be used in the majority of cases
彼はボートを逃したと思う。短期的に(?:.*?(collection info)){4,20}
は効率が数百パーセント以上向上します。