我尝试过一个正则表达式,用逗号和空格分割字符串。表达式匹配除了一个以外的所有情况。我试过的代码是:
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之间的逗号之后提供空格,那么我没有得到适当的输出。我错过了什么吗?请提供更好的解决方案。
答案 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;
}
返回您想要的内容。希望我理解正确。