C#Regex与Regex101不匹配

时间:2017-05-08 20:54:53

标签: c# regex

我有一个字符串,我试图在C#中与Regex匹配。

字符串为Hello1004,"7"

我正在使用

创建正则表达式
var reg = new Regex(@"hello\s*\[?\s*,?\s*(?<group1>\d+)\s*,\s*""(?<group2>[^""]+)""", RegexOptions.IgnoreCase);

[之前可能有多个空格,,1004。)

1004可能并非总是1004,但它始终是一个4位数字。

我想要的是:

  • group1:1004
  • group2:7

您可以看到Regex101演示here

它在演示中完美运行,但在做

foreach (var match in reg.Matches(text))
{
    var group1 = match.Groups["group1"]?.Value;
    var group2 = match.Groups["group2"]?.Value;
}

group1为空,group2中有1004。如果我在Hello1004之间放置一个空格,它在C#中工作正常。

任何人都可以解释为什么我这两者之间存在这种差异吗?

我正在使用Visual Studio 2017,.Net Framework 4。

2 个答案:

答案 0 :(得分:0)

我猜你的问题是你太具体了。你要做的第一件事是匹配4位数,而不是匹配“......”的内容。所以你只需要这样说。除非您将它们用作锚点或验证,否则不要匹配您不需要的东西。

(?<group1>\d{4})[^"]*"(?<group2>[^"]*)

答案 1 :(得分:0)

我认为一个问题是在foreach函数中,C#没有确定从removeClass()创建变量的返回类型。

我在C#VS2015中收到此错误 foreach( var match in reg.Matches(text) )

但是,如果更改为显式键入Program.cs(48,24,48,30): error CS1061: 'object' does not contain a definition for 'Groups' and no extension method 'Groups' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?),它会编译并运行,就像它的一样 应该。

Match

输出

        var text = @"Hello1004,""7""";
        var reg = new Regex(@"hello\s*\[?\s*,?\s*(?<group1>\d+)\s*,\s*""(?<group2>[^""]+)""", RegexOptions.IgnoreCase);
        foreach (Match match in reg.Matches(text))
        {
            var group1 = match.Groups["group1"]?.Value;
            var group2 = match.Groups["group2"]?.Value;
            Console.WriteLine("{0} , {1}", group1, group2);
        }