1

我有以下问题:

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

这是我正在查看的文件的片段


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

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

这是我正在使用的正则表达式模式,它似乎只找到了DAT不是名称。

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

我用 expresso 测试了很多不同的组合,但都没有用

请帮忙

4

3 回答 3

2

您可以使用RegexOptions.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

于 2012-10-22T14:49:41.883 回答
1

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

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

于 2012-10-22T14:21:48.557 回答
0

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

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

//reqData group now contains your data

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

于 2012-10-22T15:00:54.000 回答