共用方式為


替代

替代是只有在取代模式內才會被辨識的語言項目。 他們使用規則運算式模式,來定義會取代輸入字串中相符文字的所有或部分文字。 取代模式可以由一個或多個替代連同常值字元組成。 取代模式會提供給具有 replacement 參數之 Regex.Replace 方法的多載,以及提供給 Match.Result 方法。 這些方法會以 replacement 參數所定義的模式取代相符的模式。

.NET Framework 會定義下表列出的替代項目。

替代

描述

$number

在取代字串中,包含由 number 識別之擷取群組所相符的最後子字串,其中 number 是十進位數字。 如需詳細資訊,請參閱替代編號群組。

${name}

在取代字串中,包含由 (?<name> ) 指定之具名群組所相符的最後子字串。 如需詳細資訊,請參閱替代具名群組。

$$

在取代字串中包含單一的 "$" 常值。 如需詳細資訊,請參閱 替代 "$" 符號。

$&

在取代字串中包含整個符合部分的複本。 如需詳細資訊,請參閱替代整個相符項目。

$`

在取代字串中,包含輸入字串位於相符項目之前的所有的文字。 如需詳細資訊,請參閱替代相符項目前的文字。

$'

在取代字串中,包含輸入字串位於相符項目後的所有文字。 如需詳細資訊,請參閱替代相符項目後的文字。

$+

在取代字串中包含最後擷取的群組。 如需詳細資訊,請參閱替代上一個擷取群組。

$_

在取代字串中,包含整個輸入字串。 如需詳細資訊,請參閱替代整個輸入字串。

替代項目和取代模式

替代是取代模式中唯一能夠辨認的特殊建構。 不支援其他規則運算式語言項目,包括逸出字元和符合任何字元的句號 (.)。 同樣的,替代語言項目只有在取代模式中才會被辨識,而且在規則運算式模式中絕對無效。

可在規則運算式模式或替代中出現的唯一字元是 $ 字元,雖然它在每個內容中都有不同的意義。 在規則運算式模式中,$ 是符合字串結尾的錨點。 在取代模式中,$ 會指示替代項目的開頭。

注意事項注意事項

對於規則運算式內相似於取代模式的功能,請使用反向參考。如需反向參考的詳細資訊,請參閱反向參考建構

替代編號群組

$number 語言項目包括取代字串中 number 擷取群組所相符的最後子字串,其中 number 是擷取群組的索引。 例如,取代模式 $1 表示由第一個擷取群組取代的相符子字串。 如需編號擷取群組的詳細資訊,請參閱群組建構

未使用 (?<name>) 語法明確指派名稱的擷取群組,都會由左至右,從一開始編號。 具名的群組也從左到右編號,從最後一個未具名群組之索引加一的號碼開始。 例如,在規則運算式 (\w)(?<digit>\d) 中,digit 具名群組的索引為 2。

如果 number 沒有指定在規則運算式模式中定義的有效擷取群組, $number 就會解譯為用來取代每個相符項目的常值字元順序。

下列範例會使用 $number 替代從十進位值去除貨幣符號。 它會移除在貨幣數值的開頭或結尾找到的貨幣符號,並會辨識兩個最常見的十進位分隔符號 ("." 和 ",")。

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
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

規則運算式模式 \p{Sc}*(\s?\d+[.,]?\d*)\p{Sc}* 的定義方式如下表所示。

模式

描述

\p{Sc}*

符合零個或多個貨幣符號字元。

\s?

比對零或一個空白字元。

\d+

比對一個或多個十進位數字。

[.,]?

比對零個或一個句號或逗號。

\d*

比對零個或多個十進位數字。

(\s? \d+[.,]? \d*)

比對於空白字元後出現的一個或多個十進位數字,後接零個或一個句號或逗號,再後接零個或多個十進位數字。 這是第一個擷取群組。 因為取代模式為 $1,Regex.Replace 方法的呼叫會以這個擷取群組來取代整個相符的子字串。

回到頁首

替代具名群組

${name} 語言項目會替代 name 擷取群組所相符的最後子字串,其中 name 是由 (?<name>) 語言項目定義之擷取群組的名稱。 如需具名擷取群組的詳細資訊,請參閱群組建構

如果 name 沒有指定規則運算式模式中定義的有效具名擷取群組, ${name} 就會解譯為用來取代每個相符項目的常值字元順序。

下列範例會使用 ${name} 替代從十進位值去除貨幣符號。 它會移除在貨幣數值的開頭或結尾找到的貨幣符號,並會辨識兩個最常見的十進位分隔符號 ("." 和 ",")。

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
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

規則運算式模式 \p{Sc}*(?<amount>\s?\d[.,]?\d*)\p{Sc}* 的定義方式如下表所示。

模式

描述

\p{Sc}*

符合零個或多個貨幣符號字元。

\s?

比對零或一個空白字元。

\d+

比對一個或多個十進位數字。

[.,]?

比對零個或一個句號或逗號。

\d*

比對零個或多個十進位數字。

(?<amount>\s? \d[.,]? \d*)

比對空白字元,後接一個或多個十進位數字,後接零個或一個句號或逗號,再後接零個或多個十進位數字。 這是名為 amount 的擷取群組。 因為取代模式為 ${amount},Regex.Replace 方法的呼叫會以這個擷取群組來取代整個相符的子字串。

回到頁首

替代 "$" 字元

$$ 替代會在所取代的字串後插入常值 "$"。

下列範例會使用 NumberFormatInfo 物件決定目前文化特性的貨幣符號,以及它在貨幣字串中的位置。 然後,它會動態地建置規則運算式模式和取代模式。 如果此範例是在目前文化特性為 en-US 的電腦上執行,則會產生規則運算式模式 \b(\d+)(\.(\d+))? 和取代模式 $$ $1$2。 取代模式會以貨幣符號和空格,後接第一個和第二個擷取群組,來取代相符的文字。

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
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

規則運算式模式 \b(\d+)(\.(\d+))? 的定義方式如下表所示。

模式

描述

\b

在字緣的開頭開始比對。

(\d+)

比對一個或多個十進位數字。 這是第一個擷取群組。

\.

符合句號 (十進位分隔符號)。

(\d+)

比對一個或多個十進位數字。 這是第三個擷取群組。

(\.(\d+))?

符合零個或一個後接一個或多個十進位數字的句號。 這是第二個擷取群組。

替代整個相符項目

$& 替代會在取代字串中包含整段相符文字。 通常,它會用來將子字串加入相符字串的開頭或結尾。 例如,($&) 取代模式會將括號加至每個相符項目的開頭和結尾。 如果沒有相符,$& 替代就不會有任何作用。

下列範例會使用 $& 替代,將引號加入至字串陣列中所儲存之書名的開頭後結尾。

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"
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"

規則運算式模式 ^(\w+\s?)+$ 的定義方式如下表所示。

模式

描述

^

在輸入字串的開頭開始比對。

(\w+\s?)+

比對一個或多個文字字元,後接一次或多次零個或一個空白字元的模式。

$

比對輸入字串的結尾。

"$&" 取代模式會將常值引號加入每個相符項目的開頭和結尾。

回到頁首

替代相符項目前的文字

$` 替代會以相符文字前的整個輸入字串,取代相符的字串。 也就是說,它在移除相符文字的同時,也會複製直到相符文字的輸入字串。 後接相符文字的任何文字,都會在結果字串中保持不變。 如果在輸入字串中有多個相符項目,取代文字就會衍生自原始輸入字串,而非其中文字已經由先前的相符項目取代的字串。 (這個範例會提供圖例)。如果沒有相符,$` 替代就不會有任何作用。

下列範例會使用規則運算式模式 \d+,以符合輸入字串中的一個或多個十進位數字順序。 取代字串 $` 會以相符文字前的文字來取代這些數字。

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
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

在此範例中,輸入字串 "aa1bb2cc3dd4ee5" 包含五個相符項目。 下表說明會使規則運算式引擎取代輸入字串中每段相符文字的 $` 替代。 插入的文字會以粗體顯示在結果資料行中。

Match

Position

相符項目之前的字串

結果字串

1

2

aa

aaaabb2cc3dd4ee5

2

5

aa1bb

aaaabbaa1bbcc3dd4ee5

3

8

aa1bb2cc

aaaabbaa1bbccaa1bb2ccdd4ee5

4

11

aa1bb2cc3dd

aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddee5

5

14

aa1bb2cc3dd4ee

aaaabbaa1bbccaa1bb2ccddaa1bb2cc3ddee aa1bb2cc3dd4ee

回到頁首

替代相符項目後的文字

$' 替代會以相符文字後的整個輸入字串,來取代相符的字串。 也就是說,它在移除相符文字的同時,也會複製相符文字後的輸入字串。 相符文字之前的任何文字,都會在結果字串中保持不變。 如果沒有相符項目,$' 替代就不會有任何作用。

下列範例會使用規則運算式模式 \d+,以符合輸入字串中的一個或多個十進位數字順序。 取代字串 $' 會以相符文字後的文字來取代這些數字。

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
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

在此範例中,輸入字串 "aa1bb2cc3dd4ee5" 包含五個相符項目。 下表說明會使規則運算式引擎取代輸入字串中每段相符文字的 $' 替代。 插入的文字會以粗體顯示在結果資料行中。

Match

Position

相符項目之後的字串

結果字串

1

2

bb2cc3dd4ee5

aabb2cc3dd4ee5bb2cc3dd4ee5

2

5

cc3dd4ee5

aabb2cc3dd4ee5bbcc3dd4ee5cc3dd4ee5

3

8

dd4ee5

aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5dd4ee5

4

11

ee5

aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee5

5

14

String.Empty

aabb2cc3dd4ee5bbcc3dd4ee5ccdd4ee5ddee5ee

回到頁首

替代最後擷取的群組

$+ 替代會以最後的擷取群組取代相符的字串。 如果沒有擷取群組,或者最後一個擷取群組的值是 String.Empty,$+ 替代就不會有任何作用。

下列範例會識別字串中的重複單字,並使用 $+ 替代以單一的單字取代它們。 RegexOptions.IgnoreCase 選項是用來確保除了大小寫不同都相同的單字,會被視為重複項目。

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.
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.

規則運算式模式 \b(\w+)\s\1\b 的定義方式如下表所示。

模式

說明

\b

開始字緣比對。

(\w+)

比對一個或多個文字字元。 這是第一個擷取群組。

\s

比對空白字元。

\1

符合第一個擷取群組。

\b

結束字緣比對。

回到頁首

替代整個輸入字串

$_ 替代會以整個輸入字串取代相符的字串。 也就是說,它會移除相符的文字,並會以整個字串來取代,其中包括相符的文字。

下列範例會比對輸入字串中的一個或多個十進位數字。 它會使用 $_ 替代,以整個輸入字串來取代它們。

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
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

在此範例中,輸入字串 "ABC123DEF456" 包含兩個相符項目。 下表說明會使規則運算式引擎取代輸入字串中每段相符文字的 $_ 替代。 插入的文字會以粗體顯示在結果資料行中。

Match

Position

Match

結果字串

1

3

123

ABCABC123DEF456DEF456

2

5

456

ABCABC123DEF456DEFABC123DEF456

回到頁首

請參閱

概念

規則運算式語言項目