Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助制定正则表达式来解析数据吗_C#_Regex - Fatal编程技术网

C# 需要帮助制定正则表达式来解析数据吗

C# 需要帮助制定正则表达式来解析数据吗,c#,regex,C#,Regex,基本上 我想从一块文本中吐出文本。我大部分时间都在使用正则表达式,但它要么太少[跳过一节],要么太多[阅读下一节的一部分]。它基本上需要阅读我从银行对账单中提取的文本。我已经尝试了更多地阅读正则表达式,但我仍然不知道该怎么做 这里有一个小例子,让你们了解我想做什么 _4XXXXXXXXXXXXXX9_ _SOU THE HOME DEPOT 431 POMPANO BEACH * FL AUT 020112 DDA PURCHASE_ _2/1_DEBIT POS_3.15_ 下划

基本上

我想从一块文本中吐出文本。我大部分时间都在使用正则表达式,但它要么太少[跳过一节],要么太多[阅读下一节的一部分]。它基本上需要阅读我从银行对账单中提取的文本。我已经尝试了更多地阅读正则表达式,但我仍然不知道该怎么做

这里有一个小例子,让你们了解我想做什么

_4XXXXXXXXXXXXXX9_
_SOU THE HOME DEPOT 431      POMPANO BEACH * FL
AUT  020112 DDA PURCHASE_
_2/1_DEBIT POS_3.15_
下划线基本上是我想提取的部分。基本上,除了借记POS机,其他的都是

我使用的正则表达式是:

\A
(?<SerialNumber>\b[0-9]{13,16}\b)
(?<Description>.) 'PROBLEM HERE'
(?<PostingDate>
(?:1[0-2]|[1-9])/(?:3[01]|[12][0-9]|[1-9]))
(?<Amount>[,0-9]+\.[0-9]{2})
\Z
\A
(?\b[0-9]{13,16}\b)
(?)“这里有问题”
(?
(?:1[0-2]|[1-9])/(?:3[01]|[12][0-9]|[1-9]))
(?[,0-9]+\.[0-9]{2})
\Z

我无法将描述设置为任意长度的字符,因为我不知道文本部分的最大长度。我也不知道是两行描述还是一行。这就是让我困惑的主要原因。

看起来像是另一个简单的答案:不要使用正则表达式。如果每一行都是行,那么对每一行进行语法分析就不会那么困难了

public class Order
{
  public string SerialNumber { get; set; }
  public string Description { get; set; }
  public DateTime PostingDate { get; set; }
  public Decimal Amount { get; set; }

  public void SetSerialNumberFromRaw(string serialNumber)
  {
    // Convert to required type, etc.
    this.SerialNumber = <someConvertedValue>;
  }
  public void <OtherNeededValueConverters>
}    

List<string> lines = File.ReadAlllines("<filename").ToList();
List<Order> orders = new List<Order>();

Order currentOrder = null;
foreach (string line in lines)
{
  if (currentOrder = null)
  {
    currentOrder = new Order();
    orders.Add(currentOrder);
    currentOrder.SetSerialNumberFromRaw(line);
  }
  else
  {
    if (line.Contains("DEBIT POS", CultureInfo.CurrentCultureIngoreCase))
    { 
      currentOrder.SetPostingDateAndAmount(line);
      currentOrder = null;
    }
    else
    {
      currentOrder.SetAppendDescription(line);
    }
  }
}
公共类秩序
{
公共字符串序列号{get;set;}
公共字符串说明{get;set;}
公共日期时间发布日期{get;set;}
公共十进制数{get;set;}
public void setSerialNumber fromRaw(字符串serialNumber)
{
//转换为所需类型等。
this.SerialNumber=;
}
公共空间
}    

List lines=File.ReadAlllines(“我想您应该先将每四行合并为一行:

var file = @"C:\temp.txt";
var lines = System.IO.File.ReadAllLines(file);
var buffer = new List<String>();

for (var i = 0; i < lines.Length; i++ )
{
    if (i % 4 == 0) { buffer.Add(""); }
    buffer[buffer.Count - 1] += lines[i] + " ";
}

buffer.ForEach(b => Console.WriteLine(b));
var file=@“C:\temp.txt”;
var lines=System.IO.File.ReadAllLines(文件);
var buffer=新列表();
对于(变量i=0;iConsole.WriteLine(b));
然后你们可以像解析一行一样解析缓冲区中的每个条目。这可以很容易地用正则表达式或者字符串子字符串来完成。这比试图跨行解析要容易得多


上面的代码不是最干净的,但它可以工作。

我之所以使用regex,是因为我需要知道第一行是借记交易还是支票之类的。它们随行长而变化[从PDF中提取,必须删除所有垃圾。]我不能说所有交易都会有借记卡POS.+4xxxxxxxxxxxxxx3+壳牌石油57529380602椰子溪*FL+AUT 021012 VISA DDA PUR+2/10借记卡购买35.05,甚至在借记交易后立即交换,并包含每日余额。那么设置两个对象(或根据需要设置多个对象)就不难了,在第一行运行regex以检测类型,然后运行适合该对象的代码,直到您读取到该对象的末尾。我不能先将所有行连接在一起。我还需要确定描述是否也是一行或两行。我首先使用regex的主要原因。还要阅读@Eri的注释kIt不必每次都有4行。您可以将上面代码中的4行更改为一个变量,并在解析之前动态地决定每行的起始行要获取多少行。建议主要是分两次进行比较容易。一次是将相关行连接在一起,另一次是从这些行提取数据。标识是什么每种类型的记录都有哪些方面?