2015-11-26 209 views
0

这是我倾向于实现的示例输入和输出格式。我有几个解决方案在网上与正则表达式分开工作,但并不满足所有条件。希望有人能帮忙。我需要一个正则表达式分解解决方案。请不要建议图书馆。谢谢。正则表达式分隔逗号分隔符值由双引号括起来

List<string> values = new List<string>(); 
Regex lineSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled); 
foreach (Match match in lineSplit.Matches(line)) 
{ 
    values.Add(match.Value.TrimStart(',').Replace("\"", "")); 
} 

"123","456","789" 
123 
456 
789 

"123"","456","789" 
123" 
456 
789 

"123"2","456","789" 
123"2 
456 
789 

"123",2","456","789" 
123",2 
456 
789 

"123","2","456","789" 
123 
2 
456 
789 
+1

你真的需要一个正则表达式吗?为什么不'line.Replace(“\”“,”“).Split(',');?? –

+1

@FelyppOliveira这不会保留嵌入式报价按照他所需的输出 –

+0

@MatthewWatson我明白你的观点。我错过了这个细节,你的方法效果更好... –

回答

2

如果非正则表达式的方法也被认为是,我建议摆脱初始和结尾的引号的(如与.Substring(1, s.Length - 2),或.Trim('"')),然后用","分割字符串:

使用

var elements = line.Substring(1, s.Length - 2).Split(new[] {"\",\""}, StringSplitOptions.None)) 

C# demo

var s = "\"123\",\"456\",\"789\""; 
Console.WriteLine(String.Join("|", s.Substring(1, s.Length - 2).Split(new[] {"\",\""}, StringSplitOptions.None))); 
s = "\"123\"\",\"456\",\"789\""; 
Console.WriteLine(String.Join("|", s.Substring(1, s.Length - 2).Split(new[] {"\",\""}, StringSplitOptions.None))); 
s = "\"123\"2\",\"456\",\"789\""; 
Console.WriteLine(String.Join("|", s.Substring(1, s.Length - 2).Split(new[] {"\",\""}, StringSplitOptions.None))); 
s = "\"123\",2\",\"456\",\"789\""; 
Console.WriteLine(String.Join("|", s.Substring(1, s.Length - 2).Split(new[] {"\",\""}, StringSplitOptions.None))); 
s = "\"123\",\"2\",\"456\",\"789\""; 
Console.WriteLine(String.Join("|", s.Substring(1, s.Length - 2).Split(new[] {"\",\""}, StringSplitOptions.None))); 

输出:

123|456|789 
123"|456|789 
123"2|456|789 
123",2|456|789 
123|2|456|789 
0

你可以尝试这样的正则表达式:

(?<=^"|,").*?(?=","|"$)

解释:

(?<=^"|,") # positive lookbehind: one quote with comma before or at the start .*? # match everything returning at first match (?=","|"$) # positive lookahead: one quote with comma and quote after or at the end

Regex live here.

希望它有帮助。

相关问题