1

在尝试解析数据表时学习一些正则表达式,我认为没有一种简单的方法(在正则表达式中,我的意思是在 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>.*?)$ 这会将所有“令牌”加载到“令牌”中,并将所有值加载到“值”组中。很简单!但是,Regex 也匹配底线,将“This line”放入标记中,并将“while it will [...]”放入值中。

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

干杯 -
迈克。

4

2 回答 2

1

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

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

于 2013-02-06T21:12:23.477 回答
0

我希望正则表达式仅匹配____分隔线上方的行。仅使用正则表达式可以做到这一点吗?

当然有可能。添加前瞻以确保遵循这样的行,例如:

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

将此添加到表达式的末尾,以确保遵循这样的行。例如:

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

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

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

于 2013-02-06T23:04:51.560 回答