如何使'not contains'正则表达式

时间:2012-04-04 16:43:45

标签: c# c++ regex parsing split

我在定期表达创作方面没什么问题。预期投入:

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

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

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

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

4 个答案:

答案 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格式的许多极端情况。