2016-09-19 72 views
1

我試圖分裂以下類型的字符串輸出:很難理解我的正則表達式功能的

"COM_RST     :BOOL := FALSE;" 
"COM_RST     : DINT := 0;" 

所以我做了這個正則表達式的功能,我想分析後跟雙點blankspaces無限期量接着是空格或字母。

Regex Rx = new Regex(@"[ ]*[:]([ ]|[A-Z])"); 

目的是將它一分爲二,這樣我會得到如下:

sides[0] = "COM_RST"; 
sides[1] = "BOOL := FALSE;" 

我使用

string[] sides = Rx.Split(inputStr).Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); 

這似乎是對於一些投入運行,但是對於上面提到的一個,這是我得到的輸出:

sides[0] = "  COM_RST"; 
sides[1] = "B"; 
sides[2] = "OOL := FALSE;"; 
+0

爲什麼不使用_pseudo_'String.SubString(Indexof(「:」))'? _如果你想用正則表達式解決一個問題,你有兩個問題_ –

回答

2

你得到sides[1] = "B",因爲你的正則表達式包含一個捕獲組([ ]|[A-Z])。捕獲後,此文本將作爲結果列表的單獨元素輸出。請參閱this C# Regex.Split excerpt

如果在Regex.Split表達式中使用捕獲括號,則捕獲的所有文本將包含在結果字符串數組中。

如果計劃使用spaces + : + spaces大寫ASCII字母之前只拆分,用前瞻:

[ ]*:[ ]*(?=[A-Z]) 

注意,如果你使用的是免費的間距模式與支架時,才需要RegexOptions.IgnorePatternWhitespace

enter image description here

this regex demo

非正則表達式替代字符串分割爲兩個部分與第一:

var chunks = input.Split(new[] {':'}, 2).Select(p => p.Trim()).ToList(); 
+1

啊,我真的不需要正則表達式! .Split(new [] {':'},2)像魅力一樣感謝 – Innat3

0

此正則表達式與您的例子:\ S *:\ s *(?!=)