使用Regex.Matches从字符串中提取数据

时间:2017-11-23 00:04:54

标签: c# regex

我有一个总是采用一般形式的字符串。我希望从中提取信息并将其放在一个数组中。

给出以下输入:
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();
        }

但它给了我以下输出:
球员姓名
“”

但是,在此online regex tester中使用相同的正则表达式匹配我想要的所有元素。

为什么它适用于一个而不是另一个? Regex.Matches不能像我认为的那样工作吗?

3 个答案:

答案 0 :(得分:0)

您可以尝试使用以下方法之一:

[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]+

答案 1 :(得分:0)

如果您不关心文本中的 + 符号,则可以通过基于 \ n,\ r 和<分割文本来获得更简单的解决方案强> +

public static string[] DetailExtractor(string input) {

    char[] delimiterChars = {'\n', '\r', '+'};
    return input.Split(delimiterChars);
}

// call the function
string[] A = DetailExtractor("John Doe +22\r\nPong");

答案 2 :(得分:0)

这里只是猜测,但我打赌您正在使用以下内容:

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