正規表現での代替コンストラクトAlternation Constructs in Regular Expressions

代替構成体は、択一条件または条件一致を有効にするように正規表現を変更します。Alternation constructs modify a regular expression to enable either/or or conditional matching. .NET では、次の 3 つの代替構成体がサポートされています。.NET supports three alternation constructs:

| を使用したパターン マッチングPattern Matching with |

縦棒 (|) 文字を使って、| 文字で各パターンを区切った一連のパターンのいずれかと照合できます。You can use the vertical bar (|) character to match any one of a series of patterns, where the | character separates each pattern.

肯定的文字クラスと同じように、 | 文字を使うと、複数の文字のいずれか 1 文字と照合できます。Like the positive character class, the | character can be used to match any one of a number of single characters. 次の例は、肯定的文字クラスと | 文字との択一パターン マッチを使って、文字列から単語 "gray"や "grey" を検索します。The following example uses both a positive character class and either/or pattern matching with the | character to locate occurrences of the words "gray" or "grey" in a string. この場合、 | 文字を使うと、より詳細な正規表現が生成されます。In this case, the | character produces a regular expression that is more verbose.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      // Regular expression using character class.
      string pattern1 = @"\bgr[ae]y\b";
      // Regular expression using either/or.
      string pattern2 = @"\bgr(a|e)y\b";
      
      string input = "The gray wolf blended in among the grey rocks.";
      foreach (Match match in Regex.Matches(input, pattern1))
         Console.WriteLine("'{0}' found at position {1}", 
                           match.Value, match.Index);
      Console.WriteLine();
      foreach (Match match in Regex.Matches(input, pattern2))
         Console.WriteLine("'{0}' found at position {1}", 
                           match.Value, match.Index);
   }
}
// The example displays the following output:
//       'gray' found at position 4
//       'grey' found at position 35
//       
//       'gray' found at position 4
//       'grey' found at position 35           
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      ' Regular expression using character class.
      Dim pattern1 As String = "\bgr[ae]y\b"
      ' Regular expression using either/or.
      Dim pattern2 As String = "\bgr(a|e)y\b"
      
      Dim input As String = "The gray wolf blended in among the grey rocks."
      For Each match As Match In Regex.Matches(input, pattern1)
         Console.WriteLine("'{0}' found at position {1}", _
                           match.Value, match.Index)
      Next      
      Console.WriteLine()
      For Each match As Match In Regex.Matches(input, pattern2)
         Console.WriteLine("'{0}' found at position {1}", _
                           match.Value, match.Index)
      Next      
   End Sub
End Module
' The example displays the following output:
'       'gray' found at position 4
'       'grey' found at position 35
'       
'       'gray' found at position 4
'       'grey' found at position 35           

| 文字を使う正規表現 \bgr(a|e)y\b の解釈を次の表に示します。The regular expression that uses the | character, \bgr(a|e)y\b, is interpreted as shown in the following table:

パターンPattern 説明Description
\b ワード境界から開始します。Start at a word boundary.
gr 文字 "gr" と一致します。Match the characters "gr".
(a|e) "a" または "e" と一致します。Match either an "a" or an "e".
y\b ワード境界にある "y" と一致します。Match a "y" on a word boundary.

また、| 文字を使って、複数の文字や部分式との択一照合を実行できます。これは、文字リテラルと正規表現言語要素を自由に組み合わせて使うことができますThe | character can also be used to perform an either/or match with multiple characters or subexpressions, which can include any combination of character literals and regular expression language elements. (文字クラスにこの機能はありません)。次の例では、| 文字を使って、米国の社会保障番号 (SSN) (ddd-dd-dddd という形式の 9 桁の数字)、または米国の雇用者番号 (EIN) (dd-ddddddd という形式の 9 桁の数字) のいずれかを抽出します。(The character class does not provide this functionality.) The following example uses the | character to extract either a U.S. Social Security Number (SSN), which is a 9-digit number with the format ddd-dd-dddd, or a U.S. Employer Identification Number (EIN), which is a 9-digit number with the format dd-ddddddd.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example displays the following output:
//       Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
      Dim input As String = "01-9999999 020-333333 777-88-9999"
      Console.WriteLine("Matches for {0}:", pattern)
      For Each match As Match In Regex.Matches(input, pattern)
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
      Next   
   End Sub
End Module
' The example displays the following output:
'       Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
'          01-9999999 at position 0
'          777-88-9999 at position 22

この正規表現 \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b の解釈を次の表に示します。The regular expression \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b is interpreted as shown in the following table:

パターンPattern 説明Description
\b ワード境界から開始します。Start at a word boundary.
(\d{2}-\d{7}|\d{3}-\d{2}-\d{4}) 「2 桁と 7 桁の 10 進数がハイフンでつながれた文字列」または「3 桁、2 桁、4 桁の 10 進数がそれぞれハイフンでつながれた文字列」のいずれかと一致します。Match either of the following: two decimal digits followed by a hyphen followed by seven decimal digits; or three decimal digits, a hyphen, two decimal digits, another hyphen, and four decimal digits.
\d ワード境界で照合を終了します。End the match at a word boundary.

式を使用した条件一致Conditional matching with an expression

この言語要素では、最初のパターンに一致するかどうかに応じて、2 つのパターンのいずれかの照合を実行します。This language element attempts to match one of two patterns depending on whether it can match an initial pattern. 構文は次のとおりです。Its syntax is:

(?( expression ) yes | no )(?( expression ) yes | no )

ここで、 expression は照合する最初のパターン、 yesexpression が一致した場合に照合するパターン、 noexpression が一致しなかった場合に照合するパターン (省略可能) です。where expression is the initial pattern to match, yes is the pattern to match if expression is matched, and no is the optional pattern to match if expression is not matched. expression は正規表現エンジンによってゼロ幅アサーションとして処理されるので、 expressionが評価された後、正規表現エンジンによる入力ストリーム内の評価位置は前に進みません。The regular expression engine treats expression as a zero-width assertion; that is, the regular expression engine does not advance in the input stream after it evaluates expression. そのため、この構成体は次の構成体と同じです。Therefore, this construct is equivalent to the following:

(?(?= ) | no )(?(?= expression ) yes | no )

ここで、(?=expression) はゼロ幅アサーションの構成体として解釈されますwhere (?=expression) is a zero-width assertion construct. (詳しくは、「正規表現でのグループ化構成体」をご覧ください)。正規表現エンジンによって expression はアンカー (ゼロ幅アサーション) として解釈されるので、expression は、ゼロ幅アサーション (詳しくは「正規表現のアンカー」を参照) か、yes にも含まれている部分式のいずれかである必要があります。(For more information, see Grouping Constructs.) Because the regular expression engine interprets expression as an anchor (a zero-width assertion), expression must either be a zero-width assertion (for more information, see Anchors) or a subexpression that is also contained in yes. それ以外の場合、 yes パターンには一致しません。Otherwise, the yes pattern cannot be matched.

注意

expression が名前付きキャプチャ グループや番号付きキャプチャ グループである場合、代替構成体はキャプチャ テストとして解釈されます。詳細については、次のセクション「有効なキャプチャ グループに基づく条件一致」を参照してください。If expression is a named or numbered capturing group, the alternation construct is interpreted as a capture test; for more information, see the next section, Conditional Matching Based on a Valid Capture Group. つまり、正規表現エンジンは、キャプチャした部分文字列を照合しようとはせず、代わりにグループが存在するかどうかをテストします。In other words, the regular expression engine does not attempt to match the captured substring, but instead tests for the presence or absence of the group.

次の例は、前の「| を使用したパターン マッチング」セクションで説明した例を少し変更したものです。The following example is a variation of the example that appears in the Either/Or Pattern Matching with | section. 条件一致を使用して、ワード境界の後の最初の 3 文字が「2 桁の数字の後にハイフン」であるかどうかを判定します。It uses conditional matching to determine whether the first three characters after a word boundary are two digits followed by a hyphen. 一致した場合は、米国の雇用者番号 (EIN) との照合を試みます。If they are, it attempts to match a U.S. Employer Identification Number (EIN). 一致しない場合は、米国の社会保険番号 (SSN) との照合を試みます。If not, it attempts to match a U.S. Social Security Number (SSN).

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example displays the following output:
//       Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
      Dim input As String = "01-9999999 020-333333 777-88-9999"
      Console.WriteLine("Matches for {0}:", pattern)
      For Each match As Match In Regex.Matches(input, pattern)
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
      Next   
   End Sub
End Module
' The example displays the following output:
'       Matches for \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
'          01-9999999 at position 0
'          777-88-9999 at position 22

この正規表現パターン \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b の解釈を次の表に示します。The regular expression pattern \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b is interpreted as shown in the following table:

パターンPattern 説明Description
\b ワード境界から開始します。Start at a word boundary.
(?(\d{2}-) 次の 3 文字が「2 桁の数字の後にハイフン」で構成されているかどうかを判定します。Determine whether the next three characters consist of two digits followed by a hyphen.
\d{2}-\d{7} 前のパターンに一致する場合は、「2 桁の数字の後にハイフン、その後に 7 桁の数字」を照合します。If the previous pattern matches, match two digits followed by a hyphen followed by seven digits.
\d{3}-\d{2}-\d{4} 前のパターンに一致しない場合は、「3 桁の 10 進数、ハイフン、2 桁の 10 進数、もう 1 つのハイフン、および 4 桁の 10 進数」を照合します。If the previous pattern does not match, match three decimal digits, a hyphen, two decimal digits, another hyphen, and four decimal digits.
\b ワード境界に一致します。Match a word boundary.

有効なキャプチャ グループに基づく条件一致Conditional matching based on a valid captured group

この言語要素では、指定されたキャプチャ グループに一致するかどうかに応じて、2 つのパターンのいずれかを照合します。This language element attempts to match one of two patterns depending on whether it has matched a specified capturing group. 構文は次のとおりです。Its syntax is:

(?( name ) | no )(?( name ) yes | no )

oror

(?( number ) | no )(?( number ) yes | no )

ここで、 name はキャプチャ グループの名前、 number はキャプチャ グループの番号です。 yes は、 name または number が一致する場合に照合する式です。 no き、一致しない場合に照合する式 (省略可能) です。where name is the name and number is the number of a capturing group, yes is the expression to match if name or number has a match, and no is the optional expression to match if it does not.

name が正規表現パターンで使用されているキャプチャ グループの名前に一致しない場合、その代替構成体は式のテスト (前のセクションで説明したもの) として解釈されます。If name does not correspond to the name of a capturing group that is used in the regular expression pattern, the alternation construct is interpreted as an expression test, as explained in the previous section. 通常、これは expressionfalseに評価されることを意味します。Typically, this means that expression evaluates to false. number が正規表現パターンで使用されている番号付きキャプチャ グループに対応しない場合は、正規表現エンジンが ArgumentExceptionをスローします。If number does not correspond to a numbered capturing group that is used in the regular expression pattern, the regular expression engine throws an ArgumentException.

次の例は、前の「| を使用したパターン マッチング」セクションで説明した例を少し変更したものです。The following example is a variation of the example that appears in the Either/Or Pattern Matching with | section. 「2 桁の数字の後にハイフン」で構成される n2 という名前付きキャプチャ グループを使用しています。It uses a capturing group named n2 that consists of two digits followed by a hyphen. 代替構成体により、このキャプチャ グループが入力文字列に一致したかどうかテストされます。The alternation construct tests whether this capturing group has been matched in the input string. 一致した場合は、場合に、米国の 9 桁の雇用者番号 (EIN) との照合を試みます。If it has, the alternation construct attempts to match the last seven digits of a nine-digit U.S. Employer Identification Number (EIN). 一致しなかった場合は、米国の 9 桁の社会保険番号 (SSN) との照合を試みます。If it has not, it attempts to match a nine-digit U.S. Social Security Number (SSN).

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example displays the following output:
//       Matches for \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
        Dim pattern As String = "\b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b"
        Dim input As String = "01-9999999 020-333333 777-88-9999"
      Console.WriteLine("Matches for {0}:", pattern)
      For Each match As Match In Regex.Matches(input, pattern)
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
      Next   
   End Sub
End Module

この正規表現パターン \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b の解釈を次の表に示します。The regular expression pattern \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b is interpreted as shown in the following table:

パターンPattern 説明Description
\b ワード境界から開始します。Start at a word boundary.
(?<n2>\d{2}-)? 「2 桁の数字の後にハイフン」の 0 個または 1 個の出現と照合します。Match zero or one occurrence of two digits followed by a hyphen. このキャプチャ グループに n2という名前を付けます。Name this capturing group n2.
(?(n2) n2 への一致が入力文字列内に見つかるかどうかテストします。Test whether n2 was matched in the input string.
\d{7} n2 が一致した場合は、7 桁の 10 進数を照合します。If n2 was matched, match seven decimal digits.
|\d{3}-\d{2}-\d{4} n2 が一致しなかった場合は、「3 桁の 10 進数、ハイフン、2 桁の 10 進数、もう 1 つのハイフン、および 4 桁の 10 進数」を照合します。If n2 was not matched, match three decimal digits, a hyphen, two decimal digits, another hyphen, and four decimal digits.
\b ワード境界に一致します。Match a word boundary.

この例を少し変更して、名前付きグループではなく番号付きグループを使用する例を次に示します。A variation of this example that uses a numbered group instead of a named group is shown in the following example. 正規表現パターンは \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\bです。Its regular expression pattern is \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example display the following output:
//       Matches for \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
        Dim pattern As String = "\b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b"
        Dim input As String = "01-9999999 020-333333 777-88-9999"
      Console.WriteLine("Matches for {0}:", pattern)
      For Each match As Match In Regex.Matches(input, pattern)
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
      Next   
   End Sub
End Module
' The example displays the following output:
'       Matches for \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
'          01-9999999 at position 0
'          777-88-9999 at position 22

関連項目See also