正则表达式用c#中的逗号和双引号拆分字符串

时间:2012-05-17 04:57:43

标签: c# regex string

我尝试过一个正则表达式,用逗号和空格分割字符串。表达式匹配除了一个以外的所有情况。我试过的代码是:

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

CASE1:“MYSQL,ORACLE”,“C#,ASP.NET”

预期输出:

“MYSQL,ORACLE”

“C#,ASP.NET”

结果:通过

CASE2:“MYSQL,ORACLE”,“C#,ASP.NET”

期望输出:

“MYSQL,ORACLE”

“C#,ASP.NET”

实际OutPut:

“MYSQL,ORACLE”

“C#

ASP.NET“

结果:失败。

如果我在两个DoubleQuotes之间的逗号之后提供空格,那么我没有得到适当的输出。我错过了什么吗?请提供更好的解决方案。

1 个答案:

答案 0 :(得分:1)

我通常会记下我的输入的EBNF来解析。

在你的情况下我会说:

List = ListItem {Space *,Space * ListItem} *;

ListItem =“”“Identifier”“”; //标识符就是一切“

空格= [\ t] +;

这意味着List由一个ListItem组成,该ListItem被零或多个(*)ListItems所包含,这些ListItems用空格分隔逗号并再次用空格。

这引导我进行以下操作(您正在搜索ListItems):

static void Main(string[] args)
{
    matchRegex("\"MYSQL,ORACLE\",\"C#,ASP.NET\"").ForEach(Console.WriteLine);
    matchRegex("\"MYSQL,ORACLE\", \"C#,ASP.NET\"").ForEach(Console.WriteLine);
}
static List<string> matchRegex(string input)
{
    List<string> strNewSplit = new List<string>();
    Regex csvSplit = new Regex(
        "(\"(?:[^\"]*)\")"
        , RegexOptions.Compiled);
    foreach (Match match in csvSplit.Matches(input))
    {
       strNewSplit.Add(match.Value.TrimStart(','))
    }
    return strNewSplit;
}

返回您想要的内容。希望我理解正确。