【问题标题】:Matching multiple lines up until a sepertor line?匹配多行直到分隔线?
【发布时间】:2013-02-06 21:03:23
【问题描述】:

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

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

干杯 -
-迈克。

【问题讨论】:

    标签: c# regex c#-4.0


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 我知道这是肯定的方法,但是因为我正在开发一个插件,并且所有文本都已经在内存中了。我的目标是尝试使用正则表达式——因为我有少数几个要在输入数据上运行,我认为如果所有“数据抓取”都使用相同的方法进行管理会更容易。 (因为我将是唯一维护我的代码的人,所以我不太担心会混淆跟随我的可怜的家伙......!我很欣赏这个答案,并意识到这是最合适的方法。: )
    【解决方案2】:

    我希望正则表达式仅匹配 ____ 分隔线上方的行。单独使用 Regex 是否可行?

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

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

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

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

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

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

    【讨论】:

    • 谢谢!这行得通。将其标记为答案,因为它在技术上回答了问题。不过,我决定在代码方面做得更多,因为我的输入字符串/格式确实有可能不遵循我要求的自己的规范。哦。谢谢! -迈克。
    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多