2

私はこれを持っています:

string input = @"(+order: top* OR +order: first* OR +order: second* OR +order: third* OR +order: ""fourth top"" OR +order: fifth*)";

次のように、上記から抽出する正規表現を取得する必要があります。

「トップ、1 番目、2 番目、3 番目、4 番目、5 番目」

私はこれを作りました

    public static string GetOrders(string input)
    {
        string pattern = @"order(.*)OR";

        List<string> orders = new List<string>();
        foreach (Match m in Regex.Matches(input, pattern))
            orders.Add(m.Value);

        return string.Join(", ", orders.ToArray());
    }

私の正規表現パターンは不完全です。「+order:」と「OR」の間のすべてを抽出できると思ったのですが、うまくいきません。要素を反復していないようです。入力文字列全体を取得するだけです。

私は何を間違っていますか?

4

1 に答える 1

3

.*order貪欲で、最初から最後まで一致しORます。

@"order(.*?)OR"動作しますが、最初の 4 つのマッチのみです。5 番目の後には が続きませんOR

したがって、より良い正規表現は次のようになります

@"order:\s*(.*?)\s*(?:OR|\))"

*さらに良い(ルールが「パラメーターにスペースが含まれておらず、で終わるか、スペースが含まれていて s で囲まれている」と仮定すると"):

@"(?<=order:\s*)(?:""[^""]*""|[^""*\s]*)"
于 2013-01-23T11:21:41.777 に答える