2017-05-30 56 views
1

您好我有坚定简单的问题,但我不是一个正则表达式高手:我有一个字符串,它看起来是这样的:结束串的

Some text 

Error codes: 

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check 

而且使用正则表达式,我试图让从错误代码:,但没有它的文本,以字符串的结尾

到目前为止我有:

(?<=Error codes:\n)(?s)(.*?)(fail check) 

它的工作原理,但其伸展的解决方案,我想,以取代读这最后一组直到结束,但迄今没有运气。

由于需要此信息,文本包含断路器。

可以说,C#将是我的首选语言的

预期成果shold样子:

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check 

我想读到字符串的结尾,我不能肯定,如果一些新的代码不会被添加。

+0

对编程语言的任何偏好? – RomanPerekhrest

+0

可以说c#将成为我的语言选择 –

+0

看起来你有一个复杂的文本文件,你试图解析。正则表达式可能很适合提取文本文件的一部分,但可能有更好的方法来解析整个文件。 – jdweng

回答

1

如果 “比方说C#将是我的首选语言的” 我建议结合的LINQ正则表达式

using System.Linq; 
using System.Text.RegularExpressions; 

... 

string source = 
    @"Some text 

Error codes: 

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check"; 

var result = source 
    .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
    .SkipWhile(line => !line.StartsWith("Error codes:")) 
    .Select(line => Regex.Match(line, @"^(?<code>[0-9]+)\s*(?<name>.+)$")) 
    .Where(match => match.Success) // Or .TakeWhile(match => match.Success) 
    .Select(match => $"{match.Groups["code"].Value} {match.Groups["name"].Value}") 
    .ToArray(); // let's represent result as an array 

测试:

Console.Write(string.Join(Environment.NewLine, result)); 

结果:

10001 iTPM full self test 
10003 less than minimum required 
10004 bad tag value 
10005 bad param size 
10006 fail check 
+0

duhh结束.. OP已发布预期输出 –

+0

@Geoman Yabes:我明白了,我很抱歉错了格式;我编辑了答案 –

1

尝试使用下面的正则表达式,从带有两个换行符的错误代码向后看。

(?<=Error codes:\n\n)[\w\s]+ 

RegexDemo

+0

看起来不错,但是如果在字符串中有昏迷的话就会中断 –

+0

您可以在匹配的类或任何想要添加的字符中添加','。 –

+0

只需['(?<=错误代码:\ n \ n)。*'](https://regex101.com/r/hVsXsQ/1)就可以实现。但不要忘记'/ s'修饰符 –