【问题标题】:Regex help - trying to detect a string or a regular expression - c#正则表达式帮助 - 尝试检测字符串或正则表达式 - c#
【发布时间】:2015-10-21 04:51:09
【问题描述】:

我的输入以逗号分隔的字符串列表形式出现,这些字符串可能表示普通字符串或封装在双引号中的正则表达式。

“[A-Z][0-9]”,你好

“[A-Z][0-9]”、“[A-Z][0-9]”

你好,你好

所以基本上,正则表达式可以在逗号的两侧有一个普通字符串,或者在正则表达式的逗号两侧有一个字符串,用双引号括起来。可以有任意数量的这些行被新行分隔,这些行将一次解析一个。我试图组合正则表达式来匹配双引号内的任何内容,并将其与字符串拆分组合以获得逗号分隔符。

Dictionary<string, string> dic = new Dictionary<string, string>();
foreach line.. ..{
    dic.Add(line Split('\n')
        .Select(x => x.Split(','))
        .ToDictionary(x => x[0], x => x[1])); 
}

所以我认为这解决了逗号和换行符的拆分问题,并将左侧和右侧放在字典中的适当键值位置。这里的问题是正则表达式可能包含逗号。或破坏拆分的新行。这就是为什么我认为我还需要尝试直接匹配双引号中的内容。对正则表达式有帮助吗?

【问题讨论】:

    标签: c# regex string


    【解决方案1】:

    你应该可以使用这样的东西:

    (?&lt;val1&gt;".*"|(?:[^,]+)),(?&lt;val2&gt;(?:".*")|(?:[^,]+))

    这 2 个值将位于捕获组 val1val2

    https://regex101.com/r/oL6mQ1/2

    正则表达式可以用来处理这样的行:

      var dic = new Dictionary<string, string>();
    
      var re = new Regex("(?<val1>\".*\"|(?:[^,]+)),(?<val2>(?:\".*\")|(?:[^,]+))", 
                         RegexOptions.Compiled);
    
      var match = re.Match(line);
      var val1 = match.Result("${val1}");
      var val2 = match.Result("${val2}");
      dic[val1] = val2;
    

    【讨论】:

    • 设置在哪里?我可以以某种方式将其组合在 .ToDictionary(x => x[0], x => x[1]) 行中吗?
    • 使用".*" 解析字符串字面量非常不稳定。一般来说,这个问题应该用 CSV 解析器来解决。
    • 使用 C# 代码查看更新答案以使用正则表达式提取 val1 和 val2
    • @nhahtdh 如果遵守所述格式,则它不是“易碎的”。 CSV 解析器有自己的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多