1

次の入力があります。

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)?"正しく動作していない可能性はありますか? もしそうなら、私は何が欠けていますか?

4

1 に答える 1

3

パターンにキャプチャ グループRegex.Splitが含まれている場合、コンテンツを分割するときにグループがキャプチャされます。これにより、8 個ではなく 15 個のアイテムが得られます。

単一の文字または文字クラスをオプションにしようとしているだけなら、グループは必要ありません。周りのグループを取り除いてみてください\r:

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

または、はい、それを非キャプチャ グループにすることもできます。

string[] inputLines = Regex.Split(inputData, @"(?:\r)?\n");
于 2013-10-16T00:46:48.207 に答える