C#Regex.Split - Subpattern返回空字符串

时间:2009-11-14 18:48:18

标签: c# regex split

嘿,这个真棒社区的第一次海报。

我在C#应用程序中有一个正则表达式来解析变量的赋值:

NewVar = 40

在文本框中输入。我希望我的正则表达式返回(使用Regex.Split)变量的名称和值,非常简单。这是我到目前为止的正则表达式:

var r = new Regex(@"^(\w+)=(\d+)$", RegexOptions.IgnorePatternWhitespace);
var mc = r.Split(command);

我的目标是在正则表达式中修剪空白而不使用返回值的Trim()方法。目前,它可以工作,但它在MatchCollection的开头返回一个空字符串,在结尾处返回一个空字符串。

使用上面的输入示例,这是从Regex.Split返回的内容:

mc[0] = ""
mc[1] = "NewVar"
mc[2] = "40"
mc[3] = ""

所以我的问题是:为什么它在开头和结尾都返回一个空字符串?

感谢。

2 个答案:

答案 0 :(得分:6)

共振RegEx.Split返回四个值就是你只有一个匹配,所以RegEx.Split正在返回:

  • 比赛前的所有文字,即“”
  • 您的匹配中的所有()群组,即“NewVar”和“40”
  • 比赛结束后的所有文字,即“”

RegEx.Split的主要目的是在匹配的正则表达式之间提取任何文本,例如,您可以使用带有“[,;]”模式的RegEx.Split来分割逗号或分号。在.NET Framework 1.0和1.1中,Regex.Split仅返回拆分值,在本例中为“”和“”,但在.NET Framework 2.0中,它被修改为还包含在Regex中与()匹配的值,这就是为什么你是完全看到“NewVar”和“40”。

您要找的是Regex.Match,而不是Regex.Split。它会完全符合您的要求:

var r = new Regex(@"^(\w+)=(\d+)$");
var match = r.Match(command);
var varName = match.Groups[0].Value;
var valueText = match.Groups[1].Value;

请注意,RegexOptions.IgnorePatternWhitespace意味着您可以在模式中包含额外的空格 - 它与匹配的文本无关。由于您的模式中没有额外的空格,因此不必要。

答案 1 :(得分:1)

From the docsRegex.Split()使用正则表达式作为拆分的分隔符。它不会将捕获的组从输入字符串中分离出来。此外,IgnorePatternWhitespace忽略模式中未转义的空格,而不是输入。

相反,请尝试以下方法:

var r = new Regex(@"\s*=\s*");
var mc = r.Split(command);

请注意,空格实际上是作为分隔符的一部分使用的。