1

我有一些以下格式的字符串:

--> ABCDEF_(0) "Abcde fgh"

--> GHIJ4 1

第一个应该返回 3 个匹配项:

-->
ABCDEF_(0)
"Abcde fgh"

第二个也应该返回 3 个匹配项:

-->
GHIJ4
1

所以我要匹配的是:

  1. 箭头 (-->)
  2. 非空白、非引号包围的字符组
  3. 用引号括起来的表达式,包括它们的空格

可以想象,一个字符串中可能有更多类型 (2) 和 (3) 的组,因此单个字符串可能有超过 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 回答
0

感谢一个由于某种原因被迅速删除的答案,我已经设法解决了这个问题。

想法:

  • 第一组“-->”是多余的
  • 第二组和第三组应该互换。

产生的正则表达式:

Regex sWordMatch = new Regex(
      @"""[^""]*""" + // groups of characters enclosed in quotes
      @"|[^""\s]*\S+[^""\s]*", // groups of characters without whitespace not enclosed in quotes
于 2012-05-28T17:02:44.830 回答