简体   繁体   English

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

[英]Regular Expression to split a string with comma and double quotes in c#

I have tried a regular expression to split a string with comma and space. 我试过一个正则表达式来分割一个逗号和空格的字符串。 Expression matches all the cases except only one. 表达式匹配除了一个以外的所有情况。 The code I have tried is: 我试过的代码是:

        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" CASE1:“MYSQL,ORACLE”,“C#,ASP.NET”

EXpectedOutput: EXpectedOutput:

"MYSQL,ORACLE" “MySQL和甲骨文”

"C#,ASP.NET" “C#,ASP.NET”

RESULT : PASS 结果:通过

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

ExpectedOutput: ExpectedOutput:

"MYSQL,ORACLE" “MySQL和甲骨文”

"C#,ASP.NET" “C#,ASP.NET”

Actual OutPut: 实际输出:

"MYSQL,ORACLE" “MySQL和甲骨文”

"C# “C#

ASP.NET" ASP.NET”

RESULT: FAIL. 结果:失败。

If I provide a space after a comma in between two DoubleQuotes then I didn't get appropriate output. 如果我在两个DoubleQuotes之间的逗号之后提供空格,那么我没有得到适当的输出。 Am I missing anything? 我错过了什么吗? Please provide a better solution. 请提供更好的解决方案。

I normally write down the EBNF of my Input to parse. 我通常写下我的输入的EBNF来解析。

In your case I would say: 在你的情况下,我会说:

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

ListItem = """ Identifier """; ListItem =“”“标识符”“”; // Identifier is everything whitout " //标识符就是一切

Space = [\\t ]+; 空格= [\\ t] +;

Which means a List consists of a ListItem that is folled by zero or mutliple (*) ListItems that are separated with spaces a comma and again spaces. 这意味着List由一个ListItem组成,该ListItem被零或多个(*)ListItems所包含,这些ListItems用逗号和空格分隔空格。

That lead me to the following (you are searching for 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;
}

Which returns what you wanted. 哪个返回你想要的。 Hope I understood you correctly. 希望我理解正确。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM