【问题标题】:REGEX Expression C#. Split string by whitespace outside the quotation marks正则表达式 C#。用引号外的空格分割字符串
【发布时间】:2018-02-02 15:25:03
【问题描述】:

我正在尝试为 Split 函数定义一个正则表达式,以便获得由空格分割的所有子字符串,省略那些包含在单引号中的空格。

例子:

key1:value1 key2:'value2 value3'

我需要这些分隔值:

  • key1:value1

  • key2:'value2 value3'

我尝试以不同的方式执行此操作:

  • Regex.Split(q, @"(\s)^('\s')").ToList();
  • Regex.Split(q, @"(\s)(^'.\s.')").ToList();
  • Regex.Split(q, @"(?=.*\s)").ToList();

我对这段代码有什么问题?

你能帮我解决这个问题吗?

提前致谢

【问题讨论】:

  • k1 : v1 k2 : 'v2 v3' 是一个有效的输入吗?如果是这样,您期望什么输出?
  • 您是否在尝试解析 JSON?不要为此使用正则表达式。使用 JSON.NET。
  • @AleksAndreev ,不,这不是有效的输入 只有这个:---> k1:v1 k2:'v2 v3' 每个参数之间只有一个空格 在这种情况下,我希望看到:- k1:v1 - k2:'v2 v3'
  • @WiktorStribiżew 不,这不是 JSON 是 URL 的一部分(AWS Cloudsearch 参数)
  • 下面有有效的答案吗?如果是,请考虑接受。

标签: c# regex string split


【解决方案1】:

一个工作示例:

(\w+):(?:(\w+)|'([^']+)')

(\w+)       # key: 1 or more word chars (captured)
:           # literal
(?:         # non-captured grouped alternatives
(\w+)       # value: 1 or more word chars (captured)
|           # or
'([^']+)'   # 1 or more not "'" enclosed by "'" (captured)
)           # end of group

Demo

你的尝试:

(\s)^('\s')

^ 表示行首,\s 是空白字符。如果您想使用非运算符,这仅适用于字符类 [^\s] -> 1 个字符而不是空格。

【讨论】:

  • 在这种情况下,我应该使用 Regex.Matches 而不是 Regex.Split?
  • 在 Java 中,您可以使用 while (Matcher.find()) { String key = Matcher.group(1), etc。我不知道 c#。
【解决方案2】:

尝试以下:

       static void Main(string[] args)
        {
            string input = "key1:value1 key2:'value2 value3'";
            string pattern = @"\s*(?'key'[^:]+):((?'value'[^'][^\s]+)|'(?'value'[^']+))";

            MatchCollection matches = Regex.Matches(input, pattern);
            foreach (Match match in matches)
            {
                Console.WriteLine("Key : '{0}', Value : '{1}'", match.Groups["key"].Value, match.Groups["value"].Value);
            }
            Console.ReadLine();
        }

【讨论】:

  • 我正在检查这个,看起来非常接近......实际上 key1 和 key2 可以是任何单词(是一个字段名)。 value1、value2 和 value3 相同 我应该使用 \w 是这种情况,而不是键和值吗?类似于: - 字符串模式 = @"\s*(?'\w*'[^:]+):((?'\w*'[^'][^\s]+)|'(?' \w*'[^']+))";另外,您提出的解决方案我错过了最后一个配额
  • 名称“键”和“值”只是正则表达式中的组名。我喜欢使用名称而不是组索引号。
【解决方案3】:
    var st = "key1:value1 key2:'value2 value3'";
     var result = Regex.Matches(st, @"\w+:\w+|\w+:\'[^']+\'");

    foreach (var item in result)
        Console.WriteLine(item);

结果应该是:

key1:value1
key2:'value2 value3'

【讨论】:

  • 我正在检查这个,看起来非常接近......实际上 key1 和 key2 可以是任何单词(是一个字段名)。 value1、value2 和 value3 相同 我应该使用 \w* 是这种情况,而不是键和值吗?类似于: - var result = Regex.Matches(st, @"\w*:\w*|\w*:\'\w*.*\'");我尝试使用它,但有些东西不起作用,但我知道这非常接近
  • @Sebastian \w+ 我会使用。我会更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
相关资源
最近更新 更多