2017-01-10 114 views
0

对于一个项目,我需要将字符串值分隔成一个字符串列表。 是建立如下的字符串:正则表达式排除字符串到数组的模式

string unprocessed = "\"foo,bar\",\"foobar\",\"shizzle ma nizzle\""; 

我想INT进入类似如下的数组:

string[] processed = [] { "\"foo,bar\"", "\"foobar\"", "\"shizzle ma nizzle\""}; 

为此,使用正则表达式匹配系统,该代码分离的IM “,”字符组合。我到目前为止的代码如下:

Regex reg = new Regex(@"((?!(,""|"",)).)+"); 
string regmatch = "\"\"wubba,lubba\",\"dup dub\"\""; 
var matches = reg.Matches(regmatch); 

Assert.AreEqual(2, matches.Count); 
Assert.AreEqual("\"dup dub\"\"", matches[1].Value); // passes 
Assert.AreEqual("\"\"wubba,lubba\"", matches[0].Value); // fails because value = \"\"wubba,lubba 

到目前为止,我得到一个微小的错误,如示例代码所示。现在我在做东西,我快到了。有人可以帮我解决这个正则表达式问题吗?还是有更好的方法来做到这一点?

+0

你为什么不干脆用String .Split(String [],StringSplitOptions)? –

+0

@DavideVisentin和什么应该作为String []传递? –

+0

@SergeyBerezovskiy新字符串[] {“\,\”}。 –

回答

2

由于您的要求还要求您捕获多个冗余报价m在任何给定的子串方舟(为什么???)塞吉Berezovskly的图案应产生的一个调整所期望的结果:

var processed = Regex.Matches(unprocessed, "\"+[^\"]+\"+") 
        .Cast<Match>() 
        .Select(m => m.Value) 
        .ToList(); 
+0

的第一个正确答案开始时他想要得到的'已处理的'样本中缺少这个 – martijn

2

只要捕获其中大约有报价和内部无报价符号序列:

var processed = Regex.Matches(unprocessed, "\"[^\"]+\"") 
        .Cast<Match>() 
        .Select(m => m.Value) 
        .ToArray(); 

输出:

[ 
    "\"foo,bar\"", 
    "\"foobar\"", 
    "\"shizzle ma nizzle\"" 
] 

如果简单枚举是对你有好处,你可以用漂亮的简单的查询:

var processed = from Match m in Regex.Matches(unprocessed, "\"[^\"]+\"") 
       select m.Value; 
+0

你可以使用查询语法来产生一个'List',并且通过围绕在括号后跟'.ToList()' – Abion47

+0

当我用它来分隔“”“wubba,lubba”“,”“dub dub”“ “它给了我错误的wubba lubba和配音配音。查看我的示例代码 – martijn

+0

另外,如果您只打算使用匹配而不使用组,则没有理由在模式中使用分组语法。它返回模式字符串中没有括号的完全相同的结果。 – Abion47

相关问题