Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于在c中拆分带有逗号和双引号的字符串的正则表达式#_C#_Regex_String - Fatal编程技术网

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

C# 用于在c中拆分带有逗号和双引号的字符串的正则表达式#,c#,regex,string,C#,Regex,String,我尝试了一个正则表达式来拆分带有逗号和空格的字符串。表达式匹配除一个以外的所有情况。我尝试过的代码是: List<string> strNewSplit = new List<string>(); Regex csvSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled); foreach (Match match in c

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

        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;
List strNewSplit=new List();
Regex csvSplit=new Regex(“(?:^,)(\”(?:[^\“]+\“\”*“\”*”),RegexOptions.Compiled);
foreach(csvSplit.Matches中的匹配(输入))
{
strNewSplit.Add(match.Value.TrimStart(',');
}
返回strNewSplit;
案例1:“MYSQL,ORACLE”,“C#,ASP.NET”

预期输出:

“MYSQL,ORACLE”

“C#,ASP.NET”

结果:通过

案例2:“MYSQL,ORACLE”,“C#,ASP.NET”

预期输出:

“MYSQL,ORACLE”

“C#,ASP.NET”

实际输出:

“MYSQL,ORACLE”

“C#

ASP.NET“

结果:失败。


如果我在两个双引号之间的逗号后提供空格,则我没有得到适当的输出。我是否遗漏了任何内容?请提供更好的解决方案。

我通常写下要分析的输入的EBNF

就你而言,我会说:

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

ListItem=“”标识符”“;//标识符是所有省略的内容”

空格=[\t]+

这意味着列表由一个ListItem组成,该ListItem后面跟有零或多个(*)ListItems,这些ListItems之间用空格、逗号和空格分隔

这使我了解以下内容(您正在搜索列表项):

static void Main(字符串[]args)
{
matchRegex(“\'MYSQL,ORACLE\,\'C#,ASP.NET\”).ForEach(Console.WriteLine);
matchRegex(“\'MYSQL,ORACLE\,\'C#,ASP.NET\”).ForEach(Console.WriteLine);
}
静态列表matchRegex(字符串输入)
{
List strNewSplit=新列表();
Regex csvSplit=新的Regex(
"(\"(?:[^\"]*)\")"
,RegexOptions.Compiled);
foreach(csvSplit.Matches中的匹配(输入))
{
strNewSplit.Add(match.Value.TrimStart(','))
}
返回strNewSplit;
}

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

谢谢,它工作得很好。我还添加了另一个选项,如果我的输入像C#,“asp.net,SQLSERVER”,那么我希望分别输出像C#和“asp.net,SQLSERVER”。但您建议只提供“asp.net,SQLSERVER”“还有,我叫C#。谢谢你的支持,我正在寻找用逗号和空格分隔的方法。如果字符串包含双代码,那么应该像我的输入是C#,asp.net,“sqlserver,LinuxJava”一样单独处理,然后输出应该是C#,然后是asp.net,然后是“sqlserver,LinuxJava”。我希望我已经清楚地提到了我的问题,正如我所说的,试着写下你输入的所有变体的EBNF。如果您无法实现构建ebnf,那么您可能无法一步完成正则表达式。您还可以用分号替换列表中“”中的所有逗号,然后可以先用逗号拆分,然后再用分号拆分。也许您可以调整此解决方案
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;
}