为什么没有找到或捕获第二个模式c#

时间:2012-10-22 14:19:00

标签: c# regex parsing

我有以下问题:

我正在尝试从我们的开发人员使用的工具中解析txt文件输出

以下是我正在查看的文件的片段


 DAT1                DAT(IL)
:NAME            R|OM_SW_1_ILP|AG

现在我需要做的是搜索DAT1,然后将:NAME后面的文字与其对应的DAT匹配

以下是我正在使用它的正则表达式模式似乎只找到DAT而不是名称。

^(?<number>DAT[0-9]{1,3}).*(?<name>:NAME)?

我用expresso测试了大量不同的组合但没有工作

请帮忙

3 个答案:

答案 0 :(得分:2)

您可以使用RegexOptions.Singleline

  

<强> SINGLELINE

     

指定单行模式。更改点(。)的含义,使其匹配每个字符(而不是除\ n之外的每个字符)。

用于跨多行匹配模式。

此外,您正在寻找一个正面的背后隐藏,以便在 :NAME之后找到文字。


示例:

void Main()
{
    var s = @"DAT1                DAT(IL)
              :NAME            R|OM_SW_1_ILP|AG";
    var p =  @"^(?<number>DAT[0-9]{1,3}).*(?<=:NAME\s+)(?<name>[^\s]*)";
    var m = Regex.Match(s, p, RegexOptions.Singleline);
    m.Groups["number"].Value.Dump();
    m.Groups["name"].Value.Dump();
}

<强>结果:

  

DAT1
  [R | OM_SW_1_ILP | AG

答案 1 :(得分:1)

:NAME...是否应该在新线上?如果是这样,您必须设置RegexOptions.Multiline选项,或明确匹配换行符,例如 [\r\n]+,因为.与换行符不匹配。

另外,考虑让.*非贪婪, .*?

答案 2 :(得分:0)

您必须使用single line mode来匹配所需的数据

(?<number>DAT[0-9]{1,3})(?<reqData>.*?)(?<name>:NAME)

//reqData group now contains your data

此处无需使用^,因为您要匹配可包含其他数据的文本文件中的文本。