2017-05-30 47 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'修飾符 –