我在定期表达创作方面没什么问题。预期投入:
blahblahblah, blahblahblah, 'blahblahblah', "blahblahblah, asdfd"
我需要用逗号分隔单词到数组。但是,我不能使用split函数,因为逗号也可以在字符串中出现。所以,预期的输出是:
arr[0] = blahblahblah
arr[1] = blahblahblah
arr[2] = 'blahblahblah'
arr[3] = "blahblahblah, asdfd"
有人知道一些正则表达式或其他可以帮助我并给我similair输出的解决方案吗?请帮忙。
答案 0 :(得分:0)
我不确定这是最优的,但它会在http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx的测试用例中生成正确的输出:
(?>"[^"]*")|(?>'[^']*')|(?>[^,\s]+)
C#字符串版本:
@"(?>""[^""]*"")|(?>'[^']*')|(?>[^,\s]+)"
答案 1 :(得分:0)
一种可能的方法是用逗号分割(使用string.Split
,而不是RegEx),然后迭代结果。对于包含0或2个'
或"
个字符的每个结果,请将其添加到新列表中。如果结果包含1 '
或"
,请重新加入后续项目(添加逗号),直到结果为2 '
或"
,然后将其添加到新列表。
答案 2 :(得分:0)
考虑到有限的问题,你可以做这样的事情。正则表达式更短,可能更简单。
string line = <YourLine>
var result = new StringBuilder();
var inQuotes = false;
foreach(char c in line)
{
switch (c)
{
case '"':
result.Append()
inQuotes = !inQuotes;
break;
case ',':
if (!inQuotes)
{
yield return result.ToString();
result.Clear();
}
default:
result.Append()
break;
}
}
答案 3 :(得分:0)
不要滚动自己的CSV解析器,而应考虑使用.NET Framework附带的标准,开箱即用的TextFieldParser class。
或者,使用Microsoft Ace和OleDbDataReader直接通过ADO.NET读取文件。可以在许多其他帖子like this one中找到样本。还有这个older post on CodeProject可以作为样本使用。只需确保您引用最新的Ace驱动程序而不是旧的Jet.OLEDB.4.0
驱动程序
从长远来看,这些选项比任何自定义构建的文件解析器都更容易维护。而且他们已经知道如何处理围绕着不那么完整的CSV格式的许多极端情况。