C# 使用正则表达式从收据获取数据

C# 使用正则表达式从收据获取数据,c#,.net,regex,string,split,C#,.net,Regex,String,Split,我使用正则表达式从收据中获取每个行项目的数据。 收据将如下所示: Qty Desc 1 JD *# MARTINI *# 2 XXXXXX 3 YYYYYY 4 JD PEPSI *# ((\d+)\s+(.*)(\s+\*#)?) 所有项目都有数量和说明,其中一些项目还有额外的*#。另外,请注意,描述中可以有空格,甚至多行,每行都可以有自己的*.。我想要捕捉数量和描述(如果超过一行,则获取所有行),而我根本不关心额外的*.。因此,在本例中,对于第一行

我使用正则表达式从收据中获取每个行项目的数据。 收据将如下所示:

Qty Desc
1   JD *#
    MARTINI *#   
2   XXXXXX 
3   YYYYYY
4   JD
    PEPSI *#
((\d+)\s+(.*)(\s+\*#)?)
所有项目都有数量和说明,其中一些项目还有额外的
*#
。另外,请注意,描述中可以有空格,甚至多行,每行都可以有自己的
*.
。我想要捕捉数量和描述(如果超过一行,则获取所有行),而我根本不关心额外的
*.
。因此,在本例中,对于第一行项目,我将捕获Quantity=1和Description=“JD MARTINI”。对于第四个,数量=4,描述=“京东百事”

我当前的正则表达式如下所示:

Qty Desc
1   JD *#
    MARTINI *#   
2   XXXXXX 
3   YYYYYY
4   JD
    PEPSI *#
((\d+)\s+(.*)(\s+\*#)?)
它不起作用,我认为这是因为最后一个括号是可选的,这允许贪婪的
(.*)
捕获所有内容。如果最后一个括号不是可选的,则正则表达式将为具有额外
*.
的行项目执行其工作,但它不会匹配第一个和第三个括号(因为它们没有额外的
*.

有什么想法吗?

试试这个正则表达式(使用
多行
选项):


在阅读了您的修改后的问题之后,我确定您想要完成的事情不能用一个正则表达式来完成。您必须执行正则表达式匹配+替换的组合。(见问题:)

匹配正则表达式:(\d+)\s+([A-Z\s*#]*[A-Z]+)

替换正则表达式:(*#(\s*))(\r\n\s+(=\s)

match正则表达式将匹配数量和项目描述,包括行间的任何换行符或*#事件,而不包括最后的*#。我假设描述中的最后一个字符是字母

运行match regex后,将返回一个匹配数组,需要对其进行迭代才能将其转换为对象。我为你写了一些方便的代码。对于每个对象,您将对对象的描述运行replace regex,这将删除多余的空格和*#


试试这个。我想它能满足你的需要

((\d+)\s+(.+?)(\s+\*#)*)

你的描述都是纯文本的,还是有空格?@Ann L-干得好,我只是想问一下:-)顺便说一句,你可能想在regexlib.com上试试regex测试工具。我发现它非常有用。很抱歉忘了提这个。它们确实有空格。这可能是因为我使用的是Regex Coach,但它与任何内容都不匹配。我在这个页面上尝试过:它在Regex Coach中匹配。是否选中了多行框?如果将其用作目标字符串:“1示例一\n\n1示例二*#\n测试一*#\n1示例三*#\nTest二*#”,它将与“1示例二*#”不匹配,并且它将用“1示例一”捕获一些额外的空格。它不能完全满足我的需要,但这是我的错,我没有给出一个更好、更详细的例子来说明我正在努力实现的目标。请看编辑后的问题。做得好,解释得很好。谢谢它只获取每个行项目描述的第一个字符。