正規表現での置換Substitutions in Regular Expressions

置換は、置換パターン内でのみ認識される言語要素です。Substitutions are language elements that are recognized only within replacement patterns. 置換では、正規表現パターンを使用して、入力文字列内の一致するテキストを置換するテキストの全体または一部を定義します。They use a regular expression pattern to define all or part of the text that is to replace matched text in the input string. 置換パターンは、1 個以上の置換と、リテラル文字で構成されます。The replacement pattern can consist of one or more substitutions along with literal characters. 置換パターンは、Regex.Replace パラメーターを持つ replacement メソッドのオーバーロードおよび Match.Result メソッドに対して用意されています。Replacement patterns are provided to overloads of the Regex.Replace method that have a replacement parameter and to the Match.Result method. メソッドは、一致するパターンを、 replacement パラメーターで定義されているパターンで置換します。The methods replace the matched pattern with the pattern that is defined by the replacement parameter.

.NET Framework では、次の表に示す置換要素が定義されています。The .NET Framework defines the substitution elements listed in the following table.

代入Substitution 説明Description
$ number$ number numberで識別されるキャプチャ グループに一致する最後の部分文字列を置換文字列に含めます。 number は 10 進値です。Includes the last substring matched by the capturing group that is identified by number, where number is a decimal value, in the replacement string. 詳細については、「 番号付きグループの置換」を参照してください。For more information, see Substituting a Numbered Group.
${ name }${ name } (?<name> ) で指定された名前付きグループに一致する最後の部分文字列を置換文字列に含めます。Includes the last substring matched by the named group that is designated by (?<name> ) in the replacement string. 詳細については、「 名前付きグループの置換」を参照してください。For more information, see Substituting a Named Group.
$$ 置換文字列に 1 つの "$" リテラルを含めます。Includes a single "$" literal in the replacement string. 詳細については、「 "$" 文字の置換」を参照してください。For more information, see Substituting a "$" Symbol.
$& 一致した文字列全体のコピーを置換文字列に含めます。Includes a copy of the entire match in the replacement string. 詳細については、「 一致した文字列全体の置換」を参照してください。For more information, see Substituting the Entire Match.
$` 一致した場所より前にある入力文字列のテキストすべてを置換文字列に含めます。Includes all the text of the input string before the match in the replacement string. 詳細については、「 一致した文字列より前にあるテキストの置換」を参照してください。For more information, see Substituting the Text before the Match.
$' 一致した場所より後にある入力文字列のテキストすべてを置換文字列に含めます。Includes all the text of the input string after the match in the replacement string. 詳細については、「 一致した文字列より後にあるテキストの置換」を参照してください。For more information, see Substituting the Text after the Match.
$+ 最後にキャプチャされたグループを置換文字列に含めます。Includes the last group captured in the replacement string. 詳細については、「 キャプチャされた最後のグループの置換」を参照してください。For more information, see Substituting the Last Captured Group.
$_ 入力文字列全体を置換文字列に含めます。Includes the entire input string in the replacement string. 詳細については、「 入力文字列全体の置換」を参照してください。For more information, see Substituting the Entire Input String.

置換要素と置換パターンSubstitution Elements and Replacement Patterns

置換構成体は、置換パターンで認識される特殊な構成体です。Substitutions are the only special constructs recognized in a replacement pattern. 文字エスケープやピリオド (.) など、任意の文字に一致する他の正規表現言語要素はいずれもサポートされていません。None of the other regular expression language elements, including character escapes and the period (.), which matches any character, are supported. 同様に、置換言語要素は置換パターン内でのみ認識され、正規表現パターン内では有効ではありません。Similarly, substitution language elements are recognized only in replacement patterns and are never valid in regular expression patterns.

正規表現パターンと置換の両方に使用できる文字は $ 文字だけですが、この文字の意味はコンテキストによって異なります。The only character that can appear either in a regular expression pattern or in a substitution is the $ character, although it has a different meaning in each context. 正規表現パターンでは、 $ は文字列の末尾に一致するアンカーです。In a regular expression pattern, $ is an anchor that matches the end of the string. 置換パターンでは、 $ は置換の先頭を示します。In a replacement pattern, $ indicates the beginning of a substitution.

注意

正規表現の中で置換パターンに似た機能を利用するには、前方参照を使用します。For functionality similar to a replacement pattern within a regular expression, use a backreference. 前方参照の詳細については、「 前方参照構成体」を参照してください。For more information about backreferences, see Backreference Constructs.

番号付きグループの置換Substituting a Numbered Group

$number 言語要素は、 number キャプチャ グループに一致する最後の部分文字列を置換文字列に含めます。 number は、キャプチャ グループのインデックスです。The $number language element includes the last substring matched by the number capturing group in the replacement string, where number is the index of the capturing group. たとえば、置換パターン $1 は、一致した部分文字列がキャプチャされた最初のグループに置き換えられることを示します。For example, the replacement pattern $1 indicates that the matched substring is to be replaced by the first captured group. 番号付きキャプチャ グループの詳細については、「 Grouping Constructs」を参照してください。For more information about numbered capturing groups, see Grouping Constructs.

$ 以降のすべての数字が、 number グループに所属すると解釈されます。All digits that follow $ are interpreted as belonging to the number group. そうしたくない場合は、代わりに名前付きグループを使用できます。If this is not your intent, you can substitute a named group instead. たとえば、 ${1}1 の代わりに、置換文字列 $11 を使用して、最初のキャプチャ グループの値と数字 "1" を置換文字列として定義できます。For example, you can use the replacement string ${1}1 instead of $11 to define the replacement string as the value of the first captured group along with the number "1". 詳細については、「 名前付きグループの置換」を参照してください。For more information, see Substituting a Named Group.

(?<name>) 構文を使用して名前が明示的に割り当てられていないキャプチャ グループには、1 から開始する番号が左から右の順に割り当てられます。Capturing groups that are not explicitly assigned names using the (?<name>) syntax are numbered from left to right starting at one. 名前付きグループにも、最後の名前のないグループのインデックスよりも 1 つ大きい数値から開始する番号が、左から右へと順に割り当てられます。Named groups are also numbered from left to right, starting at one greater than the index of the last unnamed group. たとえば、正規表現 (\w)(?<digit>\d)では、 digit という名前付きグループのインデックスは 2 です。For example, in the regular expression (\w)(?<digit>\d), the index of the digit named group is 2.

number が、正規表現パターンで定義される有効なキャプチャ グループを指定していない場合は、 $number が、一致した各文字列の置換に使用されるリテラル文字列シーケンスとして解釈されます。If number does not specify a valid capturing group defined in the regular expression pattern, $number is interpreted as a literal character sequence that is used to replace each match.

次の例では、 $number の置換を使用して、10 進値から通貨記号を削除しています。The following example uses the $number substitution to strip the currency symbol from a decimal value. 通貨値の先頭または末尾に見つかった通貨記号を削除し、最も一般的な 2 つの桁区切り記号 ("." および ",") を認識します。It removes currency symbols found at the beginning or end of a monetary value, and recognizes the two most common decimal separators ("." and ",").

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}*";
      string replacement = "$1";
      string input = "$16.32 12.19 £16.29 €18.29  €18,29";
      string result = Regex.Replace(input, pattern, replacement);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//       16.32 12.19 16.29 18.29  18,29
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "\p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}*"
      Dim replacement As String = "$1"
      Dim input As String = "$16.32 12.19 £16.29 €18.29  €18,29"
      Dim result As String = Regex.Replace(input, pattern, replacement)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'       16.32 12.19 16.29 18.29  18,29

正規表現パターン \p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}* は、次の表に示すように定義されています。The regular expression pattern \p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}* is defined as shown in the following table.

パターンPattern 説明Description
\p{Sc}* 0 個以上の通貨記号文字と一致します。Match zero or more currency symbol characters.
\s? 0 個または 1 個の空白文字と一致します。Match zero or one white-space characters.
\d+ 1 個以上の 10 進数と一致します。Match one or more decimal digits.
[.,]? 0 個または 1 個のピリオドまたはコンマと一致します。Match zero or one period or comma.
\d* 0 個以上の 10 進数と一致します。Match zero or more decimal digits.
(\s?\d+[.,]?\d*) 空白の後に 1 つ以上の 10 進数、0 個または 1 個のピリオドまたはコンマ、さらに 0 個以上の 10 進数が続くパターンに一致します。Match a white space followed by one or more decimal digits, followed by zero or one period or comma, followed by zero or more decimal digits. これが最初のキャプチャ グループです。This is the first capturing group. 置換パターンは $1 であるため、Regex.Replace メソッドを呼び出すと、一致する部分文字列全体がこのキャプチャされたグループに置き換えられます。Because the replacement pattern is $1, the call to the Regex.Replace method replaces the entire matched substring with this captured group.

ページのトップへBack to top

名前付きグループの置換Substituting a Named Group

${name} 言語要素は、 name キャプチャ グループに一致する最後の部分文字列を置換します。ここで、 name(?<name>) 言語要素で定義されているキャプチャ グループの名前です。The ${name} language element substitutes the last substring matched by the name capturing group, where name is the name of a capturing group defined by the (?<name>) language element. 名前付きキャプチャ グループの詳細については、「 Grouping Constructs」を参照してください。For more information about named capturing groups, see Grouping Constructs.

name が正規表現パターンで定義されている有効な名前付きキャプチャ グループを指定していないものの、数字で構成されている場合、 ${name} は番号付きグループとして解釈されます。If name doesn't specify a valid named capturing group defined in the regular expression pattern but consists of digits, ${name} is interpreted as a numbered group.

name が、正規表現パターンで定義されている有効な名前付きキャプチャ グループも有効な番号付きキャプチャ グループも指定していない場合、 ${name} は、一致した各文字列の置換に使用されるリテラル文字列シーケンスとして解釈されます。If name specifies neither a valid named capturing group nor a valid numbered capturing group defined in the regular expression pattern, ${name} is interpreted as a literal character sequence that is used to replace each match.

次の例では、 ${name} の置換を使用して、10 進値から通貨記号を削除しています。The following example uses the ${name} substitution to strip the currency symbol from a decimal value. 通貨値の先頭または末尾に見つかった通貨記号を削除し、最も一般的な 2 つの桁区切り記号 ("." および ",") を認識します。It removes currency symbols found at the beginning or end of a monetary value, and recognizes the two most common decimal separators ("." and ",").

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\p{Sc}*(?<amount>\s?\d+[.,]?\d*)\p{Sc}*";
      string replacement = "${amount}";
      string input = "$16.32 12.19 £16.29 €18.29  €18,29";
      string result = Regex.Replace(input, pattern, replacement);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//       16.32 12.19 16.29 18.29  18,29
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "\p{Sc}*(?<amount>\s?\d+[.,]?\d*)\p{Sc}*"
      Dim replacement As String = "${amount}"
      Dim input As String = "$16.32 12.19 £16.29 €18.29  €18,29"
      Dim result As String = Regex.Replace(input, pattern, replacement)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'       16.32 12.19 16.29 18.29  18,29

正規表現パターン \p{Sc}*(?<amount>\s?\d[.,]?\d*)\p{Sc}* は、次の表に示すように定義されています。The regular expression pattern \p{Sc}*(?<amount>\s?\d[.,]?\d*)\p{Sc}* is defined as shown in the following table.

パターンPattern 説明Description
\p{Sc}* 0 個以上の通貨記号文字と一致します。Match zero or more currency symbol characters.
\s? 0 個または 1 個の空白文字と一致します。Match zero or one white-space characters.
\d+ 1 個以上の 10 進数と一致します。Match one or more decimal digits.
[.,]? 0 個または 1 個のピリオドまたはコンマと一致します。Match zero or one period or comma.
\d* 0 個以上の 10 進数と一致します。Match zero or more decimal digits.
(?<amount>\s?\d[.,]?\d*) 空白の後に 1 つ以上の 10 進数、0 個または 1 個のピリオドまたはコンマ、さらに 0 個以上の 10 進数が続くパターンに一致します。Match a white space, followed by one or more decimal digits, followed by zero or one period or comma, followed by zero or more decimal digits. これは、 amountという名前のキャプチャ グループです。This is the capturing group named amount. 置換パターンは ${amount} であるため、Regex.Replace メソッドを呼び出すと、一致する部分文字列全体がこのキャプチャされたグループに置き換えられます。Because the replacement pattern is ${amount}, the call to the Regex.Replace method replaces the entire matched substring with this captured group.

ページのトップへBack to top

"$" 文字の置換Substituting a "$" Character

$$ の置換は、リテラル文字 "$" を置換文字列に挿入します。The $$ substitution inserts a literal "$" character in the replaced string.

次の例では、 NumberFormatInfo オブジェクトを使用して、現在のカルチャの通貨記号と、通貨文字列内でのその配置を決定します。The following example uses the NumberFormatInfo object to determine the current culture's currency symbol and its placement in a currency string. 次に、正規表現パターンと置換パターンの両方を動的に構築します。It then builds both a regular expression pattern and a replacement pattern dynamically. 現在 en-US カルチャが使用されているコンピューターでこの例を実行すると、 \b(\d+)(\.(\d+))? という正規表現パターンと $$ $1$2という置換パターンが生成されます。If the example is run on a computer whose current culture is en-US, it generates the regular expression pattern \b(\d+)(\.(\d+))? and the replacement pattern $$ $1$2. 置換パターンは、一致するテキストを、通貨記号と空白に続いて、キャプチャされた最初および 2 番目のグループで置換します。The replacement pattern replaces the matched text with a currency symbol and a space followed by the first and second captured groups.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      // Define array of decimal values.
      string[] values= { "16.35", "19.72", "1234", "0.99"};
      // Determine whether currency precedes (True) or follows (False) number.
      bool precedes = NumberFormatInfo.CurrentInfo.CurrencyPositivePattern % 2 == 0;
      // Get decimal separator.
      string cSeparator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
      // Get currency symbol.
      string symbol = NumberFormatInfo.CurrentInfo.CurrencySymbol;
      // If symbol is a "$", add an extra "$".
      if (symbol == "$") symbol = "$$";
      
      // Define regular expression pattern and replacement string.
      string pattern = @"\b(\d+)(" + cSeparator + @"(\d+))?"; 
      string replacement = "$1$2";
      replacement = precedes ? symbol + " " + replacement : replacement + " " + symbol;
      foreach (string value in values)
         Console.WriteLine("{0} --> {1}", value, Regex.Replace(value, pattern, replacement));
   }
}
// The example displays the following output:
//       16.35 --> $ 16.35
//       19.72 --> $ 19.72
//       1234 --> $ 1234
//       0.99 --> $ 0.99
Imports System.Globalization
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      ' Define array of decimal values.
      Dim values() As String = { "16.35", "19.72", "1234", "0.99"}
      ' Determine whether currency precedes (True) or follows (False) number.
      Dim precedes As Boolean = (NumberFormatInfo.CurrentInfo.CurrencyPositivePattern Mod 2 = 0)
      ' Get decimal separator.
      Dim cSeparator As String = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator
      ' Get currency symbol.
      Dim symbol As String = NumberFormatInfo.CurrentInfo.CurrencySymbol
      ' If symbol is a "$", add an extra "$".
      If symbol = "$" Then symbol = "$$"
      
      ' Define regular expression pattern and replacement string.
      Dim pattern As String = "\b(\d+)(" + cSeparator + "(\d+))?" 
      Dim replacement As String = "$1$2"
      replacement = If(precedes, symbol + " " + replacement, replacement + " " + symbol)
      For Each value In values
         Console.WriteLine("{0} --> {1}", value, Regex.Replace(value, pattern, replacement))
      Next
   End Sub
End Module
' The example displays the following output:
'       16.35 --> $ 16.35
'       19.72 --> $ 19.72
'       1234 --> $ 1234
'       0.99 --> $ 0.99

正規表現パターン \b(\d+)(\.(\d+))? は、次の表に示すように定義されています。The regular expression pattern \b(\d+)(\.(\d+))? is defined as shown in the following table.

パターンPattern 説明Description
\b ワード境界の先頭から照合を開始します。Start the match at the beginning of a word boundary.
(\d+) 1 個以上の 10 進数と一致します。Match one or more decimal digits. これが最初のキャプチャ グループです。This is the first capturing group.
\. ピリオド (桁区切り記号) と一致します。Match a period (the decimal separator).
(\d+) 1 個以上の 10 進数と一致します。Match one or more decimal digits. これが 3 番目のキャプチャ グループです。This is the third capturing group.
(\.(\d+))? ピリオドの後に 1 つ以上の 10 進数が続くパターンの 0 回または 1 回の出現と一致します。Match zero or one occurrence of a period followed by one or more decimal digits. これが 2 番目のキャプチャ グループです。This is the second capturing group.

一致した文字列全体の置換Substituting the Entire Match

$& の置換は、一致した文字列全体を置換文字列に含めます。The $& substitution includes the entire match in the replacement string. 通常は、一致した文字列の先頭または末尾に部分文字列を追加するために使用されます。Often, it is used to add a substring to the beginning or end of the matched string. たとえば、 ($&) という置換パターンは、一致した各文字列の先頭と末尾にかっこを追加します。For example, the ($&) replacement pattern adds parentheses to the beginning and end of each match. 一致する文字列がない場合、 $& の置換は無効です。If there is no match, the $& substitution has no effect.

$& の置換を使用して、文字列配列に格納されている書籍タイトルの先頭と末尾に引用符を追加する例を次に示します。The following example uses the $& substitution to add quotation marks at the beginning and end of book titles stored in a string array.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"^(\w+\s?)+$";
      string[] titles = { "A Tale of Two Cities", 
                          "The Hound of the Baskervilles", 
                          "The Protestant Ethic and the Spirit of Capitalism", 
                          "The Origin of Species" };
      string replacement = "\"$&\"";
      foreach (string title in titles)
         Console.WriteLine(Regex.Replace(title, pattern, replacement));
   }
}
// The example displays the following output:
//       "A Tale of Two Cities"
//       "The Hound of the Baskervilles"
//       "The Protestant Ethic and the Spirit of Capitalism"
//       "The Origin of Species"
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "^(\w+\s?)+$"
      Dim titles() As String = { "A Tale of Two Cities", _
                                 "The Hound of the Baskervilles", _
                                 "The Protestant Ethic and the Spirit of Capitalism", _
                                 "The Origin of Species" }
      Dim replacement As String = """$&"""
      For Each title As String In titles
         Console.WriteLine(Regex.Replace(title, pattern, replacement))
      Next  
   End Sub
End Module
' The example displays the following output:
'       "A Tale of Two Cities"
'       "The Hound of the Baskervilles"
'       "The Protestant Ethic and the Spirit of Capitalism"
'       "The Origin of Species"

正規表現パターン ^(\w+\s?)+$ は、次の表に示すように定義されています。The regular expression pattern ^(\w+\s?)+$ is defined as shown in the following table.

パターンPattern 説明Description
^ 入力文字列の先頭から照合を開始します。Start the match at the beginning of the input string.
(\w+\s?)+ 1 つ以上の単語文字の後に 0 個または 1 個の空白文字が 1 回以上続くパターンに一致します。Match the pattern of one or more word characters followed by zero or one white-space characters one or more times.
$ 入力文字列の末尾と一致します。Match the end of the input string.

"$&" という置換パターンは、各一致文字列の先頭と末尾にリテラルの一重引用符を追加します。The "$&" replacement pattern adds a literal quotation mark to the beginning and end of each match.

ページのトップへBack to top

一致した文字列より前にあるテキストの置換Substituting the Text Before the Match

$` の置換は、一致した場所より前にある入力文字列全体で一致した文字列を置換します。The $` substitution replaces the matched string with the entire input string before the match. つまり、一致した場所までの入力文字列を複製し、一致したテキストを削除します。That is, it duplicates the input string up to the match while removing the matched text. 結果文字列では、一致したテキストに続くテキストは変更されません。Any text that follows the matched text is unchanged in the result string. 入力文字列に複数の一致文字列がある場合、置換テキストは、テキストが前の一致で置換された文字列からではなく、元の入力文字列から派生します If there are multiple matches in an input string, the replacement text is derived from the original input string, rather than from the string in which text has been replaced by earlier matches. (具体的な例を次に示します。)一致する文字列がない場合、$` の置換は無効です。(The example provides an illustration.) If there is no match, the $` substitution has no effect.

次の例では、正規表現パターン \d+ を使用して、入力文字列内の 1 つ以上の 10 進数のシーケンスを照合します。The following example uses the regular expression pattern \d+ to match a sequence of one or more decimal digits in the input string. 置換文字列 $` は、これらの数字を、一致文字列より前にあるテキストで置換します。The replacement string $` replaces these digits with the text that precedes the match.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = "aa1bb2cc3dd4ee5";
      string pattern = @"\d+";
      string substitution = "$`";
      Console.WriteLine("Matches:");
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);

      Console.WriteLine("Input string:  {0}", input);
      Console.WriteLine("Output string: " + 
                        Regex.Replace(input, pattern, substitution));
   }
}
// The example displays the following output:
//    Matches:
//       1 at position 2
//       2 at position 5
//       3 at position 8
//       4 at position 11
//       5 at position 14
//    Input string:  aa1bb2cc3dd4ee5
//    Output string: aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddeeaa1bb2cc3dd4ee
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim input As String = "aa1bb2cc3dd4ee5"
      Dim pattern As String = "\d+"
      Dim substitution As String = "$`"
      Console.WriteLine("Matches:")
      For Each match As Match In Regex.Matches(input, pattern)
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
      Next   
      Console.WriteLine("Input string:  {0}", input)
      Console.WriteLine("Output string: " + _
                        Regex.Replace(input, pattern, substitution))
   End Sub
End Module
' The example displays the following output:
'    Matches:
'       1 at position 2
'       2 at position 5
'       3 at position 8
'       4 at position 11
'       5 at position 14
'    Input string:  aa1bb2cc3dd4ee5
'    Output string: aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddeeaa1bb2cc3dd4ee

この例では、入力文字列 "aa1bb2cc3dd4ee5" に 5 つの一致が含まれています。In this example, the input string "aa1bb2cc3dd4ee5" contains five matches. $` の置換によって、正規表現エンジンが入力文字列の各一致文字列をどのように置換するかを、次の表に示します。The following table illustrates how the $` substitution causes the regular expression engine to replace each match in the input string. 挿入されたテキストは結果列に太字で示されています。Inserted text is shown in bold in the results column.

一致したものMatch 位置Position 一致した場所より前にある文字列String before match 結果文字列Result string
11 22 aaaa aaaabb2cc3dd4ee5aaaabb2cc3dd4ee5
22 55 aa1bbaa1bb aaaabbaa1bbcc3dd4ee5aaaabbaa1bbcc3dd4ee5
33 88 aa1bb2ccaa1bb2cc aaaabbaa1bbccaa1bb2ccdd4ee5aaaabbaa1bbccaa1bb2ccdd4ee5
44 1111 aa1bb2cc3ddaa1bb2cc3dd aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddee5aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddee5
55 1414 aa1bb2cc3dd4eeaa1bb2cc3dd4ee aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddeeaa1bb2cc3dd4eeaaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddeeaa1bb2cc3dd4ee

ページのトップへBack to top

一致した文字列より後にあるテキストの置換Substituting the Text After the Match

$' の置換は、一致した場所より後にある入力文字列全体で一致した文字列を置換します。The $' substitution replaces the matched string with the entire input string after the match. つまり、一致した場所より後にある入力文字列を複製し、一致したテキストを削除します。That is, it duplicates the input string after the match while removing the matched text. 結果文字列では、一致したテキストより前にあるテキストは変更されません。Any text that precedes the matched text is unchanged in the result string. 一致する文字列がない場合、 $' の置換は無効です。If there is no match, the $' substitution has no effect.

次の例では、正規表現パターン \d+ を使用して、入力文字列内の 1 つ以上の 10 進数のシーケンスを照合します。The following example uses the regular expression pattern \d+ to match a sequence of one or more decimal digits in the input string. 置換文字列 $' は、これらの数字を、一致文字列に続くテキストで置換します。The replacement string $' replaces these digits with the text that follows the match.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = "aa1bb2cc3dd4ee5";
      string pattern = @"\d+";
      string substitution = "$'";
      Console.WriteLine("Matches:");
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
      Console.WriteLine("Input string:  {0}", input);
      Console.WriteLine("Output string: " + 
                        Regex.Replace(input, pattern, substitution));
   }
}
// The example displays the following output:
//    Matches:
//       1 at position 2
//       2 at position 5
//       3 at position 8
//       4 at position 11
//       5 at position 14
//    Input string:  aa1bb2cc3dd4ee5
//    Output string: aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim input As String = "aa1bb2cc3dd4ee5"
      Dim pattern As String = "\d+"
      Dim substitution As String = "$'"
      Console.WriteLine("Matches:")
      For Each match As Match In Regex.Matches(input, pattern)
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
      Next   
      Console.WriteLine("Input string:  {0}", input)
      Console.WriteLine("Output string: " + _
                        Regex.Replace(input, pattern, substitution))
   End Sub
End Module
' The example displays the following output:
'    Matches:
'       1 at position 2
'       2 at position 5
'       3 at position 8
'       4 at position 11
'       5 at position 14
'    Input string:  aa1bb2cc3dd4ee5
'    Output string: aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee

この例では、入力文字列 "aa1bb2cc3dd4ee5" に 5 つの一致が含まれています。In this example, the input string "aa1bb2cc3dd4ee5" contains five matches. $' の置換によって、正規表現エンジンが入力文字列の各一致文字列をどのように置換するかを、次の表に示します。The following table illustrates how the $' substitution causes the regular expression engine to replace each match in the input string. 挿入されたテキストは結果列に太字で示されています。Inserted text is shown in bold in the results column.

一致したものMatch 位置Position 一致した場所より後にある文字列String after match 結果文字列Result string
11 22 bb2cc3dd4ee5bb2cc3dd4ee5 aabb2cc3dd4ee5bb2cc3dd4ee5aabb2cc3dd4ee5bb2cc3dd4ee5
22 55 cc3dd4ee5cc3dd4ee5 aabb2cc3dd4ee5bbcc3dd4ee5cc3dd4ee5aabb2cc3dd4ee5bbcc3dd4ee5cc3dd4ee5
33 88 dd4ee5dd4ee5 aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5dd4ee5aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5dd4ee5
44 1111 ee5ee5 aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee5aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee5
55 1414 String.Empty aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5eeaabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee

ページのトップへBack to top

キャプチャされた最後のグループの置換Substituting the Last Captured Group

$+ の置換は、キャプチャされた最後のグループで一致した文字列を置換します。The $+ substitution replaces the matched string with the last captured group. キャプチャされたグループがない場合、またはキャプチャされた最後のグループの値が String.Empty の場合、$+ の置換は無効です。If there are no captured groups or if the value of the last captured group is String.Empty, the $+ substitution has no effect.

次の例では、文字列内の重複する単語を識別し、$+ の置換を使用して、これらの単語をその単語 1 つに置換します。The following example identifies duplicate words in a string and uses the $+ substitution to replace them with a single occurrence of the word. RegexOptions.IgnoreCase オプションを使用すると、大文字と小文字の違いを除いて同一である単語が重複と見なされるようになります。The RegexOptions.IgnoreCase option is used to ensure that words that differ in case but that are otherwise identical are considered duplicates.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(\w+)\s\1\b";
      string substitution = "$+";
      string input = "The the dog jumped over the fence fence.";
      Console.WriteLine(Regex.Replace(input, pattern, substitution, 
                        RegexOptions.IgnoreCase));
   }
}
// The example displays the following output:
//      The dog jumped over the fence.
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "\b(\w+)\s\1\b"
      Dim substitution As String = "$+"
      Dim input As String = "The the dog jumped over the fence fence."
      Console.WriteLine(Regex.Replace(input, pattern, substitution, _
                                      RegexOptions.IgnoreCase))
   End Sub
End Module
' The example displays the following output:
'      The dog jumped over the fence.

正規表現パターン \b(\w+)\s\1\b は、次の表に示すように定義されています。The regular expression pattern \b(\w+)\s\1\b is defined as shown in the following table.

パターンPattern 説明Description
\b ワード境界から照合を開始します。Begin the match at a word boundary.
(\w+) 1 つ以上の単語文字に一致します。Match one or more word characters. これが最初のキャプチャ グループです。This is the first capturing group.
\s 空白文字と一致します。Match a white-space character.
\1 キャプチャされた最初のグループと一致します。Match the first captured group.
\b ワード境界で照合を終了します。End the match at a word boundary.

ページのトップへBack to top

入力文字列全体の置換Substituting the Entire Input String

$_ の置換は、一致した文字列を入力文字列全体で置換します。The $_ substitution replaces the matched string with the entire input string. つまり、一致したテキストを削除し、一致したテキストを含む文字列全体でそのテキストを置換します。That is, it removes the matched text and replaces it with the entire string, including the matched text.

次の例では、入力文字列の 1 つ以上の 10 進数を照合します。The following example matches one or more decimal digits in the input string. $_ の置換を使用して、これらを入力文字列全体で置換します。It uses the $_ substitution to replace them with the entire input string.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = "ABC123DEF456";
      string pattern = @"\d+";
      string substitution = "$_";
      Console.WriteLine("Original string:          {0}", input);
      Console.WriteLine("String with substitution: {0}", 
                        Regex.Replace(input, pattern, substitution));      
   }
}
// The example displays the following output:
//       Original string:          ABC123DEF456
//       String with substitution: ABCABC123DEF456DEFABC123DEF456
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim input As String = "ABC123DEF456"
      Dim pattern As String = "\d+"
      Dim substitution As String = "$_"
      Console.WriteLine("Original string:          {0}", input)
      Console.WriteLine("String with substitution: {0}", _
                        Regex.Replace(input, pattern, substitution))      
   End Sub
End Module
' The example displays the following output:
'       Original string:          ABC123DEF456
'       String with substitution: ABCABC123DEF456DEFABC123DEF456

この例では、入力文字列 "ABC123DEF456" に 2 つの一致が含まれています。In this example, the input string "ABC123DEF456" contains two matches. $_ の置換によって、正規表現エンジンが入力文字列の各一致文字列をどのように置換するかを、次の表に示します。The following table illustrates how the $_ substitution causes the regular expression engine to replace each match in the input string. 挿入されたテキストは結果列に太字で示されています。Inserted text is shown in bold in the results column.

一致したものMatch 位置Position 一致したものMatch 結果文字列Result string
11 33 123123 ABCABC123DEF456DEF456ABCABC123DEF456DEF456
22 55 456456 ABCABC123DEF456DEFABC123DEF456ABCABC123DEF456DEFABC123DEF456

関連項目See also