难以理解我的正则表达式函数的输出

时间:2016-09-19 11:13:23

标签: c# regex split

我正在尝试拆分以下类型的字符串:

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

所以我创建了这个正则表达式函数,我想要解析无限量的空格,然后是双点后跟空格或字母。

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;";

2 个答案:

答案 0 :(得分:2)

您获得Object,因为您的正则表达式包含捕获组sides[1] = "B"。捕获后,此文本将作为结果列表的单独元素输出。见this C# Regex.Split excerpt

  

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。

如果您打算仅在大写ASCII字母前使用([ ]|[A-Z]) + spaces + :进行拆分,请使用前瞻:

spaces

请注意,仅当您使用[ ]*:[ ]*(?=[A-Z]) 的自由间距模式时才需要括号。

enter image description here

请参阅this regex demo

非正则表达式替代方案将字符串拆分为2个部分,并使用第一个RegexOptions.IgnorePatternWhitespace

:

答案 1 :(得分:0)

此正则表达式适用于您的示例:\ s *:\ s *(?!=)