[英]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.