我有以下问题:
我正在尝试从我们的开发人员使用的工具中解析txt文件输出
以下是我正在查看的文件的片段
DAT1 DAT(IL)
:NAME R|OM_SW_1_ILP|AG
现在我需要做的是搜索DAT1
,然后将:NAME
后面的文字与其对应的DAT
匹配
以下是我正在使用它的正则表达式模式似乎只找到DAT
而不是名称。
^(?<number>DAT[0-9]{1,3}).*(?<name>:NAME)?
我用expresso测试了大量不同的组合但没有工作
请帮忙
答案 0 :(得分:2)
<强> 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
此处无需使用^
,因为您要匹配可包含其他数据的文本文件中的文本。