匹配多条线直到分隔线?

时间:2013-02-06 21:03:24

标签: c# regex c#-4.0

在尝试解析数据表时学习一些正则表达式,我认为这不是一种简单的方法(在Regex中,我的意思是......在C#中,确定!)来做到这一点。假设我有一行文件:

0000AA  One Token    -  Value
0000AA  Another Token-  Another Value
0000AA  YA Token     -  Yet Another
0000AA  Yes, Another -  Even More
0000AA
0000AA  ______________________________________________________________________
0000AA  This line - while it will match the regex, shouldn't.

所以我有一个简单的多行正则表达式:     ^\s*[A-Z]{2}[0-9]{4}\s\s*(?<token>.*?)\-(?<value>.*?)$ 这会将所有'标记'加载到'标记'中,并将所有值加载到'值'组中。很简单!但是,正则表达式ALSO与底线相匹配,将“此行”放入令牌中,并将“它将[...]”放入值中。

基本上,我希望正则表达式只匹配____分隔线上方的行。单独使用Regex是否可以实现,或者我是否需要首先将我的传入字符串修改为____分隔线上的.Split()?

干杯全部 -
-Mike。

2 个答案:

答案 0 :(得分:1)

仅使用正则表达式解析此类文本文件不会使用正确的工具来完成作业。尽管可能,但它既低效又不必要地复杂。

我实际上不会将所有文本加载到字符串中并在此行上拆分,因为这不是最有效的方法。我宁愿在一个循环中读取文件,一次一行,根据需要处理每一行。然后在到达此特定行时停止处理。

答案 1 :(得分:0)

  

我希望正则表达式只匹配____分隔线上方的行。单独使用Regex会有可能吗?

当然有可能。添加一个预测以确保跟随这样的行,例如:

(?=(?s).*^\w{6}[ \t]+_{4,})

将其添加到表达式的末尾以确保跟随此行。例如:

(?m)^\s*[A-Z]{2}[0-9]{4}\s\s*(?<token>.*?)\-(?<value>.*)$(?=(?s).*^\w{6}[ \t]+_{4,})

(还在表达式中添加了ms标志。)

这不是很有效,因为正则表达式引擎可能需要扫描每个匹配的大部分字符串。