正则表达式展望未来

时间:2018-06-28 16:44:26

标签: c# regex

我已经在论坛上浏览了类似内容,但是找不到我需要的东西。

我正在读这样的字符串:

11/2/2017  12:26:42.064  OUT         <stx>1H|\^&|||3_7556_Batman|||||cobas 8000|TSDWN|P|1<cr>P|1||221074||DOE^JOHN||19990622|M<cr>O|1|221074|0^50010^3^^S1^|^^^962^\^^^993^\^^^994^\^^^8228^|S|20171102084806|20171102084000||||A||||1||||||||||O<cr>C|1|L|DOE,JOHN^221074^^^|G<cr>L|1|N<cr><etx>C0<cr><lf>

并使用正则表达式@"\s{2,}"对其进行拆分 我的问题是,有时该字符串在<stx>行之后包含多个空格。示例:

11/2/2017  12:26:42.064  OUT         <stx>1H|\^&|||3_7556_Batman|||||cobas 8000|TSDWN|P|1<cr>P|1||221074||DOE^JOHN||19990622|M<cr>O|1|221074|0^50010^3^^S1^|^^^962^\^^^993^\^^^994^\^^^8228^|S|20171102084806|        |||A||||1||||||||||O<cr>C|1|L|DOE,JOHN^221074^^^|G<cr>L|1|N<cr><etx>C0<cr><lf>

我只想捕获<stx>之前的多个空格。我已经尝试了一些积极的先行方式,但是它捕获了太多的小组。 @"\s{2,}(?=(.*)(<stx>))"

我只需要4组信息:日期,时间,出站,消息

2 个答案:

答案 0 :(得分:0)

在C#Regex.Split中,捕获的子字符串与拆分的块一起返回。

您需要从模式中删除捕获组:

var line = @"11/2/2017  12:26:42.064  OUT         <stx>1H|\^&|||3_7556_Batman|||||cobas 8000|TSDWN|P|1<cr>P|1||221074||DOE^JOHN||19990622|M<cr>O|1|221074|0^50010^3^^S1^|^^^962^\^^^993^\^^^994^\^^^8228^|S|20171102084806|20171102084000||||A||||1||||||||||O<cr>C|1|L|DOE,JOHN^221074^^^|G<cr>L|1|N<cr><etx>C0<cr><lf>";
var split = Regex.Split(line, @"\s{2,}(?=.*<stx>)");
foreach (var s in split)
{
   Console.WriteLine(s);
}

请参见C# demo

输出:

11/2/2017
12:26:42.064
OUT
<stx>1H|\^&|||3_7556_Batman|||||cobas 8000|TSDWN|P|1<cr>P|1||221074||DOE^JOHN||19990622|M<cr>O|1|221074|0^50010^3^^S1^|^^^962^\^^^993^\^^^994^\^^^8228^|S|20171102084806|20171102084000||||A||||1||||||||||O<cr>C|1|L|DOE,JOHN^221074^^^|G<cr>L|1|N<cr><etx>C0<cr><lf>

答案 1 :(得分:0)

像这样使用前瞻就足够了

\s{2,}(?=<stx>)

获取所有出现的至少两个空格,后跟<stx>