C#Regex.Split-子模式返回空字符串
嘿,这个很棒的社区的第一张海报 我的C#应用程序中有一个正则表达式,用于解析变量赋值:C#Regex.Split-子模式返回空字符串,c#,regex,split,C#,Regex,Split,嘿,这个很棒的社区的第一张海报 我的C#应用程序中有一个正则表达式,用于解析变量赋值: NewVar = 40 在文本框中输入。我希望正则表达式返回(使用Regex.Split)变量的名称和值,非常简单。这是我到目前为止的正则表达式: var r = new Regex(@"^(\w+)=(\d+)$", RegexOptions.IgnorePatternWhitespace); var mc = r.Split(command); 我的目标是修剪正则表达式中的空格,而不是使用返回值的Tr
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()
使用正则表达式作为分隔符进行拆分。它不会将捕获的组从输入字符串中拆分出来。另外,IgnorePatternWhitespace
忽略模式中未替换的空白,而不是输入
相反,请尝试以下操作:
var r = new Regex(@"\s*=\s*");
var mc = r.Split(command);
请注意,空白实际上是作为分隔符的一部分使用的。reson RegEx.Split返回四个值,因为您正好有一个匹配项,所以RegEx.Split返回:
- 匹配前的所有文本,即“”
- 匹配中的所有()组,即“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而不是String.Split有什么好处。这就是OP的意图吗?@Juliet OP希望避免使用
Trim()
删除=
符号周围的多余空格。它的执行效率不高,但我想它确实节省了额外的代码行。您编辑的正则表达式可以工作。是的,我希望节省几行代码。此外,如果我有多个赋值,您的正则表达式也可以工作:NewVar=OldVar=5。谢谢。“我希望我的正则表达式(使用Regex.Split)返回变量的名称和值,非常简单。”--为什么不使用Regex.Match呢?在不知道如何使用信息的情况下,唯一的区别是能够返回字符串数组,而不是使用MatchCollection
。依我看,Regex.Match
更直观,但也许有理由支持字符串数组。