共用方式為


System.Text.RegularExpressions.Regex.Match 方法

本文提供此 API 參考文件的補充備註。

Match(String, Int32) 方法會傳回符合正則表達式模式的第一個子字串,從輸入字串中的 startat 字元位置開始或之後。 Match(String, Int32) 方法搜尋的正規表達式模式是由其中一個 Regex 類別建構函式的呼叫所定義。 如需用來建置正規表示式模式之語言項目的相關信息,請參閱 正規表示式語言 - 快速參考

startat 參數

您可以使用 startat 參數,選擇性地指定字串中的起始位置。 會忽略在字串中 startat 之前開始的任何匹配項目。 如果您未指定起始位置,搜尋會從預設位置開始,也就是從左至右搜尋中 input 的左端,以及從右至左搜尋中 input 的右端。 儘管從 startat開始,但返回的任何匹配項目的索引相對於字串開頭。

雖然正則表達式引擎不會在 startat之前傳回任何匹配項目,但它不會忽略 startat之前的字串。 這表示像 錨點的斷言向後檢測的斷言 仍然適用於整個輸入。 例如,下列程式碼包含一個包含反向預測的模式,即使它出現在輸入字串中5之前的startat索引,它仍然被滿足。

using System;
using System.Text.RegularExpressions;

namespace Examples
{
    public class Example3
    {
        public static void Main()
        {
            string input = "Zip code: 98052";
            var regex = new Regex(@"(?<=Zip code: )\d{5}");
            Match match = regex.Match(input, 5);
            if (match.Success)
                Console.WriteLine($"Match found: {match.Value}");
        }
    }
}

// This code prints the following output:
// Match found: 98052

小提示

  • 如果模式以 ^ 錨點開頭,但 startat 大於 0,則不會在單行搜尋中找到匹配項目,因為它們受 ^ 的限制必須從索引 0 開始。
  • \G 錨點startat滿足。 因此,如果您想限制匹配,使其於字串中特定字符位置開始,請將正則表達式以 \G 在左側錨定,以適用於從左至右的模式。 這會限制匹配,必須精確從 startat 開始(或,當需要多個匹配時,匹配必須是連續的)。

由右至左搜尋

從右至左搜尋,也就是使用 RegexOptions.RightToLeft 選項建構正則表示式模式時,會以下列方式運作:

  • 掃描會向相反方向移動,且模式會從後方(右)到前方(左)進行比對。
  • 默認起始位置是輸入字串的右端。
  • 如果指定了 startat,則由右至左掃描從字元開始於 startat - 1 (而非 startat)。
  • \G 錨點被指定在模式的右端時,將限制首次比對必須恰好以 startat - 1 作結尾。

如需從右至左搜尋的詳細資訊,請參閱 從右至左模式

判斷是否找到相符

您可以藉由檢查傳回 Match 物件的 Success 屬性的值,來判斷輸入字串中是否已找到正規表示式模式。 如果找到相符項目,傳回 Match 物件的 Value 屬性會包含符合正則表達式模式之 input 子字串。 如果找不到匹配項目,其值為 String.Empty

第一個或多個相符項目

這個方法會傳回在 startatinput 字元位置處或之後符合正則表達式模式的第一個子字串。 您可以透過反覆調用返回的 Match 物件的 Match.NextMatch 方法,來檢索後續匹配項目。 您也可以透過呼叫 Regex.Matches(String, Int32) 方法來一次取得所有相符項目。

逾時例外狀況

如果比對作業的運行時間超過 RegexMatchTimeoutException 建構函式指定的超時時間間隔,就會擲回 Regex.Regex(String, RegexOptions, TimeSpan) 例外狀況。 如果您在呼叫建構函式時未設定超時時間間隔,則如果作業超過為建立 Regex 對象的應用程式域所建立的任何逾時值,則會擲回例外狀況。 如果在 Regex 建構函式呼叫或應用程式域的屬性中未定義逾時,或逾時值 Regex.InfiniteMatchTimeout,則不會擲回任何例外狀況。