请帮我找一个解析数据的正则表达式:
'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多行。
任何帮助都将受到高度赞赏。感谢
答案 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)
);