我在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] = ""
所以我的问题是:为什么它在开头和结尾都返回一个空字符串?
感谢。
答案 0 :(得分:6)
共振RegEx.Split返回四个值就是你只有一个匹配,所以RegEx.Split正在返回:
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 docs,Regex.Split()
使用正则表达式作为拆分的分隔符。它不会将捕获的组从输入字符串中分离出来。此外,IgnorePatternWhitespace
忽略模式中未转义的空格,而不是输入。
相反,请尝试以下方法:
var r = new Regex(@"\s*=\s*");
var mc = r.Split(command);
请注意,空格实际上是作为分隔符的一部分使用的。