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);
请注意,空格实际上是作为分隔符的一部分使用的。