-2

我在正则表达式创建中没有什么问题。预期输入:

blahblahblah, blahblahblah, 'blahblahblah', "blahblahblah, asdfd"

我需要用逗号分隔单词到数组。但是,我不能使用拆分功能,因为逗号也可以出现在字符串中。因此,预期输出为:

arr[0] = blahblahblah
arr[1] = blahblahblah
arr[2] = 'blahblahblah'
arr[3] = "blahblahblah, asdfd"

有人知道一些正则表达式或其他可以帮助我并给我类似输出的解决方案吗?请帮忙。

4

4 回答 4

0

我不确定这是最优化的,但它在http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester 上从您的测试用例中产生了正确的输出。灰烬

(?>"[^"]*")|(?>'[^']*')|(?>[^,\s]+)

C# 字符串版本:

@"(?>""[^""]*"")|(?>'[^']*')|(?>[^,\s]+)"
于 2012-04-04T16:54:35.520 回答
0

一种可能的方法是用逗号分隔(使用string.Split,而不是 RegEx),然后迭代结果。对于包含 0 或 2'"字符的每个结果,将其添加到新列表中。当结果包含 1 'or"时,重新加入后续项目(添加逗号)直到结果具有 2 'or ",然后将其添加到新列表中。

于 2012-04-04T16:58:23.330 回答
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;                
    }
}
于 2012-04-04T17:13:37.813 回答
0

与其滚动您自己的 CSV 解析器,不如考虑使用.NET Framework 附带的标准、开箱即用的TextFieldParser 类。

或者,使用Microsoft Ace和 OleDbDataReader 通过 ADO.NET 直接读取文件。可以在许多其他帖子中找到示例,例如这个CodeProject 上有这篇较旧的帖子,您可以将其用作示例。只需确保您引用的是最新的 Ace 驱动程序而不是旧Jet.OLEDB.4.0驱动程序

从长远来看,这些选项比任何自定义构建的文件解析器更容易维护。他们已经知道如何处理围绕着文档不完整的 CSV 格式的许多极端情况。

于 2012-04-04T23:00:20.567 回答