Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Regex.Split-子模式返回空字符串_C#_Regex_Split - Fatal编程技术网

C#Regex.Split-子模式返回空字符串

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

嘿,这个很棒的社区的第一张海报

我的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()
使用正则表达式作为分隔符进行拆分。它不会将捕获的组从输入字符串中拆分出来。另外,
IgnorePatternWhitespace
忽略模式中未替换的空白,而不是输入

相反,请尝试以下操作:

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

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

reson RegEx.Split返回四个值,因为您正好有一个匹配项,所以RegEx.Split返回:

  • 匹配前的所有文本,即“”
  • 匹配中的所有()组,即“NewVar”和“40”
  • 匹配后的所有文本,即“”
Split的主要用途是提取匹配的正则表达式之间的任何文本,例如,您可以使用带有“[,;]”模式的RegEx.Split拆分逗号或分号上的文本。在NetFramework1.0和1.1中,Regex.Split只返回拆分值,在本例中为“”和“”,但在NetFramework2.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而不是String.Split有什么好处。这就是OP的意图吗?@Juliet OP希望避免使用
Trim()
删除
=
符号周围的多余空格。它的执行效率不高,但我想它确实节省了额外的代码行。您编辑的正则表达式可以工作。是的,我希望节省几行代码。此外,如果我有多个赋值,您的正则表达式也可以工作:NewVar=OldVar=5。谢谢。“我希望我的正则表达式(使用Regex.Split)返回变量的名称和值,非常简单。”--为什么不使用Regex.Match呢?在不知道如何使用信息的情况下,唯一的区别是能够返回字符串数组,而不是使用
MatchCollection
。依我看,
Regex.Match
更直观,但也许有理由支持字符串数组。