簡體   English   中英

使用Regex.Matches從字符串中提取數據

[英]Extract data from a string using Regex.Matches

我有一個始終采用一般形式的字符串。 我希望從中提取信息並將其放置在數組中。

給出以下輸入:
John Doe +22 \\ r \\ nPong

我想要以下輸出
約翰·杜
+22

我正在使用以下代碼提取所需的詳細信息。

public static string[] DetailExtractor(string input)
        {
            return Regex.Matches(input, @"(.*(?=\s\+))|(\+\d{1,2}(?=\\r\\n))|((?<=\\r\\n).*)")
                 .OfType<Match>()
                 .Select(m => m.Value)
                 .ToArray();
        }

但這給了我以下輸出:
選手姓名

但是,在此在線正則表達式測試器中使用相同的正則表達式表達式會匹配我想要的所有元素。

為什么它只對一個起作用而不對另一個起作用? Regex.Matches是否無法按我認為的方式工作?

您可以嘗試以下方法之一:

[a-z]+ [a-z]+ \+[0-9]{1,}\\r\\n[a-z]+

要么:

[a-z\s\\]+\+[0-9]{1,}[a-z\s\\]+

要么:

[\w\s]+\+\d{1,}\\r\\n[\w]+

只是在這里猜測,但我敢打賭您正在使用以下內容:

var details = DetailExtractor("John Doe +22\\r\\nPong");

上面的代碼會將\\r\\n轉換為回車符和換行符。 這將阻止您編寫的正則表達式起作用。 相反,您可以在C#中指定原始字符串,也可以轉義\\r\\n

var details = DetailExtractor(@"John Doe +22\\r\\nPong");

要么

var details = DetailExtractor("John Doe +22\\\\r\\\\nPong");

正如其他所有人所指出的那樣,有更簡單的正則表達式可用於根據您的需要進行相同類型的匹配。

下面的正則表達式稍微簡單一些,但返回的字符串數組則稍微復雜一些。

public static string[] DetailExtractor1(string input)
{
    var match = Regex.Match(input, @"^(?<name>\w+\s+\w+)\s+(?<num>\+\d+)\r\n(?<type>\w+)");

    if (match.Success)
    {
        return new string[] {
            match.Groups["name"].Value,
            match.Groups["num"].Value,
            match.Groups["type"].Value
        };
    }

    return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM