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

嘿,这个令人敬畏的社区的第一次海报。

我在我的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] = "" 

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

谢谢。

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意味着您可以在模式中包含额外的空格 – 它与匹配的文本无关。 由于您的模式中没有额外的空格,因此不必要。

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

相反,请尝试以下方法:

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

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