2013-02-06 37 views
1

学习起来有点正则表达式,而试图解析一个数据表,和我在想有没有一种简单的方法(在正则表达式,我的意思是...在C#中,务必!)做到这一点。说我有与行的文件:匹配多行直到sepertor行?

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,还是需要将我的传入字符串首先修改为____分隔线上的.Split()?

干杯所有 -
-Mike。

回答

0

我想正则表达式只匹配____分隔线上方的行。单单用正则表达式可以做到这一点吗?

当然这是可能的。添加一个前瞻,以确保这样的阵容如下,是这样的:

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

添加到您的表达式的末尾,以确保这样的阵容如下。例如:

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

(另外在表达添加ms标志。)

这是不是很有效,寿,因为正则表达式引擎可能需要通过大多数字符串每场比赛的进行扫描。

+0

谢谢!这工作。因为它在技术上回答了问题,因此将其标记为答案。不过,我决定更多地使用代码方式,因为我的输入字符串/格式有可能不遵循我要求的自己的规范。 D'哦。谢谢! -麦克风。 – Coyttl

1

解析这样的文本文件,正则表达式仅将不使用适合工作的正确工具。尽管可能,但这既不够高效,也不必要的复杂。

我真的不加载所有文本转换成字符串和分裂在此行要么,因为它不是这样做的最有效的方式。我宁愿通过循环读取文件,一次一行,根据需要处理每一行。然后在到达这条特定线路时停止处理。

+0

谢谢 - 我知道这是一个明确的方式,但由于我正在开发一个插件,并且已经将所有文本存储在内存中。我的目标是尝试使用正则表达式 - 因为我有一些它们运行在输入数据上,所以我认为如果所有'数据抓取'都是以相同的方法完成的话,管理会更容易。 (因为我将是唯一一个维护我的代码的人,所以我并不担心混淆后面跟随的可怜人...... .. 我很欣赏答案,并且意识到这是做它的最合适的方法。:) – Coyttl