请给我一个正则表达式

时间:2011-04-13 19:22:34

标签: c# regex

请帮我找一个解析数据的正则表达式:

'EBB112'  '0 23923 12272 7'    Carrots            'C' 'O' 'A' 'B' 'C'  '12/128ml'     '$9.65'       '$0.80'

'EBB211'  '0 23923 12266 6'   'Vegetables & Turkey'    'C' 'O' 'A' 'B' 'C'     '12/128ml'     '$9.65'       '$0.80'

我有这11个字段(以单引号显示),我需要逐字段解析它们并将它们保存到.csv文件中。有大约3000多行。

任何帮助都将受到高度赞赏。感谢

7 个答案:

答案 0 :(得分:2)

我建议不要自己弄清楚正则表达式 - 尝试使用适当的库来处理这样的东西。

仔细查看FileHelpers - 这是一个很棒的免费 C#库,可以处理任何类型的分隔(例如CSV,制表符分隔)或固定宽度的导入文件。 / p>

你基本上在一个代表数据的类中定义导入文件的结构(类似这样的东西:我不知道你的字段叫什么 - 所以我只是猜测: - )

using System;
using FileHelpers;

namespace ReadDataFromFile
{
    [DelimitedRecord(" ")] 
    public class DataClass
    {
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string EbbField;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string CompoundField;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string VegiField;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string C1Field;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string O1Field;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string A1Field;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string B1Field;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string C2Field;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string MlField;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string DollarField1;
        [FieldQuoted('\'', QuoteMode.OptionalForBoth)]
        public string DollarField2;
    }
}

然后FileHelpers库会为您处理所有其余的事情:

using FileHelpers;

...
  FileHelperEngine engine = new FileHelperEngine(typeof(DataClass)); 
  DataClass[] res = engine.ReadFile(@"D:\test.data") as DataClass[]; 

现在,您的数组res包含数据文件中每一行的一个条目 - 非常漂亮!

没有大惊小怪,没有muss,没有正则表达式。

答案 1 :(得分:0)

就我所见,你不需要正则表达式...

拆分为行...剥离第一个和最后一个单引号,并用此字符串拆分“''”

//编辑:

啊......那些whitspace不久前不在那里; - )

“Carrots”这一行(没有单引号的字段)让这有点痛苦

让我们在所有行上尝试使用此正则表达式作为拆分令牌:

/ '\ W +'/

忽略结果中的空字段,并标记所有不产生11个非空字段的行以供进一步处理...您将需要另一个正则表达式...

答案 2 :(得分:0)

使用text2re,一个免费的基于网络的“正则表达式”生成器。这将帮助您测试各种正则表达式。

答案 3 :(得分:0)

从这个开始

system.text.regularexpressions.regex.matches(Str,@""\'(.*?)\'"))

这将抓住单引号之间的所有内容,但你需要查看每个匹配,这将不会处理嵌套分隔符或其他此类废话的奇怪情况。

答案 4 :(得分:0)

您可以按' '分割字符串。

var array = Regex.Split(line.Substring(1, line.Length - 2), "' '");

我删除了第一个和最后一个字符,因为它们不会被拆分方法删除。

答案 5 :(得分:0)

( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ( '?'?)\ S ('? '?)\ S ('?。*'?)

我认为基本上('?。'?)是指一组可能以'结尾'开头的字符  然后任意数量的\ s 或简单地说空白

我可能错了你

答案 6 :(得分:0)

试试这个(这不会处理数据中的单引号):

string[] entries = 
    { 
        "'EBB112'        '0 23923 12272 7'    'Carrots'            'C' 'O' 'A' 'B' 'C'     '12/128ml'     '$9.65'       '$0.80'",
        "'EBB211'  '0 23923 12266 6'   'Vegetables & Turkey'    'C' 'O' 'A' 'B' 'C'     '12/128ml'     '$9.65'       '$0.80' "
    };

    var newEntries = entries.Select(a=> Regex.Replace(a, "'\\s+'", "','")).ToList();

    newEntries.ForEach(
        a=> <YOUR_FILE_STREAM>.WriteLine(a)
    );