Regex.Split不能正常工作?

时间:2013-10-16 00:44:11

标签: c# regex

我有以下输入:

void Main()
{
    string inputData = "37.7879\r\n-122.3874\r\n40.7805\r\n-111.9288\r\n36.0667\r\n-115.0927\r\n37.7879\r\n-122.3874";
    // string[] inputLines = Regex.Split(inputData, @"\r\n");
    string[] inputLines = Regex.Split(inputData, @"(\r)?\n");
    Console.WriteLine("The size of the list is: {0}", inputLines.Length);
    bool results = inputLines.All(IsValidNumber);

    foreach (string line in inputLines)
    {
        Console.WriteLine("{0} is: {1}", line, IsValidNumber(line));
    }
}

// Define other methods and classes here
public bool IsValidNumber(string input)
{
    Match match = Regex.Match(input, @"^-?\d+\.\d+$", RegexOptions.IgnoreCase);
    return match.Success;
}

我正在尝试使用Regex.Split @"\r\n",如果我使用注释行,那么我会得到预期的结果。如果我使用未注释的,我没有得到我期望的结果。我几乎100%肯定我的正则表达式是正确的如果 "\r"不存在(可能是也可能不是)。

我期待来自inputData的8个值,​​我试图验证它们是否都是有效数字。

我的"(\r)?"可能无法正常工作吗?如果是这样,我错过了什么?

1 个答案:

答案 0 :(得分:3)

如果您的模式包含捕获组Regex.Split将捕获该组,因为它正在拆分内容。这将给你15件而不是8件。

如果您只是尝试将单个字符或字符类设置为可选,则不需要组。尝试摆脱\r周围的群组:

string[] inputLines = Regex.Split(inputData, @"\r?\n");

或者,是的,您可以将其设为非捕获组:

string[] inputLines = Regex.Split(inputData, @"(?:\r)?\n");