Я должен проанализировать файлы со следующей структурой образца.NET Regex Выражения для разбора файла с разделителями
// This is a comment
// NotUsed : 123654
****************************************
* DESCRIPTION
***************************************
Header: xxx
Date: 20010101
ReqDate:20150402
P.O. 123456
Qty 10000
Part Number: xx-yy-456
Type: J
Product: xxyy123456V0.01 (bulk)
Cust ID: 51
Model:
Location: 60
UPC: 123456
*
cust_ref: Hello Worlkd
*
***************************************
* Data
***************************************
Я пытаюсь использовать следующие Regex, но не захватывая ключ/значения, когда двоеточие (:) не используется
public class TestRegEx
{
private static readonly Regex KeyValFileRegex = new Regex(@"\b(?<key>(?!:)[\w\.]+|[ \w\.]+)\s*[\s=:]\s*(?<value>[^\n]*)(?=[^()\n]*[ =:\(]?)", RegexOptions.IgnoreCase);
private static int Main(string[] args)
{
string inputStr = @"// This is a comment
// NotUsed : 123654
****************************************
* DESCRIPTION
***************************************
Header: xxx
Date: 20010101
ReqDate:20150402
P.O. 123456
Qty 10000
Part Number: xx-yy-456
Type: J
Product: xxyy123456V0.01 (bulk)
Cust ID: 51
Model:
Location: 60
UPC: 123456
*
cust_ref: Hello Worlkd
*
***************************************
* Data
***************************************";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(inputStr));
using (var r = new StreamReader(stream))
{
var data = new Data();
string line;
while ((line = r.ReadLine()) != null)
{
var match = KeyValFileRegex.Match(line);
if (!match.Success) continue;
var key = match.Groups["key"].Value;
var value = match.Groups["value"].Value;
if (!string.IsNullOrEmpty(value)) value = value.Trim();
switch (key)
{
case "Header":
data.Header = value;
break;
case "ReqDate":
data.RequestedDeliveryDate = value;
break;
case "Qty":
data.Qty = Convert.ToInt32(value);
break;
case "Type":
data.Type = value;
break;
}
}
}
return 0;
}
private class Data
{
public string Header { set; get; }
public string RequestedDeliveryDate { set; get; }
public string Brand { set; get; }
public string Po { set; get; }
public int Qty { set; get; }
public string Type { set; get; }
}
}
Любая помощь будет очень признательна.
так что если двоеточия нет, что бы вы использовали для определения разных полей? – Jeremy
Вы считали, что просто пишете код, чтобы разобрать это? Для каждой строки проверяйте пробелы '//' и '*' или пустые строки. Все остальное ищет двоеточие, которое нужно разбить, или если на первом месте нет двоеточия. Если пробел не пропускается. – juharr