1

次の形式の文字列がいくつかあります。

--> ABCDEF_(0) "Abcde fgh"

--> GHIJ4 1

最初のものは 3 つの一致を返す必要があります。

-->
ABCDEF_(0)
"Abcde fgh"

2 番目のものも 3 つの一致を返す必要があります。

-->
GHIJ4
1

だから私が一致させたいのは:

  1. 矢印 (-->)
  2. 空白や引用符で囲まれていない文字のグループ
  3. 空白を含む引用符で囲まれた式

文字列にはタイプ (2) と (3) のグループがさらに多く存在する可能性があるため、1 つの文字列に 3 つ以上の一致が含まれる可能性があります。

これまでのところ、これは私が持っているものです:

  var regex = new Regex(
      @"-->" + // match the starting arrow
      @"|[^""\s]*\S+[^""\s]*" + // match elements not surrounded by quotes, trimmed of surrounding whitespace
      @"|""[^""]+"""); // match elements surrounded by quotes

しかし、式を引用符で囲み、最初の文字列を返すため、これは機能しません。

-->
ABCDEF_(0)
"Abcde
fgh"

どの正規表現が機能しますか? 正規表現よりも簡単な方法があれば、それも受け入れます。

4

2 に答える 2

1

キャプチャを使用する方が簡単です (ここでは名前付きキャプチャを使用しました)。

var regex = new Regex(@"-->" // match the arrow
    + @"\s+(?<first>[^\s]+)" // capture the first part always unquoted
    + @"(\s+(?<second>(""[^""]+"")|[^\s]+))+"); // capture the second part, possibly quoted

var match = regex.Match("--> ABCDEF_(0) \"Abcde fgh\"");
Console.WriteLine(match.Groups["first"].Value);
Console.WriteLine(match.Groups["second"].Value);

match = regex.Match("--> GHIJ4 1");
Console.WriteLine(match.Groups["first"].Value);
Console.WriteLine(match.Groups["second"].Value);

match = regex.Match("--> GHIJ4 1 \"Test Something\" \"Another String With Spaces\" \"And yet another one\"");
Console.WriteLine(match.Groups["first"].Value);
Console.WriteLine("Total matches:" + match.Groups["second"].Captures.Count);
Console.WriteLine(match.Groups["second"].Captures[0].Value);
Console.WriteLine(match.Groups["second"].Captures[1].Value);
Console.WriteLine(match.Groups["second"].Captures[2].Value);
Console.WriteLine(match.Groups["second"].Captures[3].Value);
于 2012-05-28T16:31:56.283 に答える