2017-05-08 123 views
1

我有一个字符串,我试图匹配正则表达式在C#中。C#正则表达式不匹配Regex101

字符串是Hello1004,"7"

我与

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

创建的正则表达式(可能有多个空格,一个[1004,。)

1004可能并不总是1004,但它总是会一个4位数字。

我想要得到的是:

  • 组1:1004
  • 组2: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框架4

+2

见http://ideone.com/FA8WNg,似乎工作。 –

+0

同样在这里。在LinqPad进行测试: var s = @“Hello1004”,“7”“”; \t \t var reg = new Regex(@“hello \ s * \ [?\ s *,?\ s *(? \ d +)\ s *,\ s *”“(? [^”“] + )“”“,RegexOptions.IgnoreCase); \t \t reg.Match(s)。倾倒(); – Vidar

+0

@WiktorStribiżew嗯......这似乎工作。但是,这绝对不适用于我的实际应用程序。如果适用,我将使用我的.NET版本更新这个问题。 –

回答

0

我认为一个问题是,在foreach功能,C#是不是确定的foreach(var match in reg.Matches(text))返回类型创建一个变种。

我得到这个错误在C#VS2015
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); 
     } 

输出

1004 , 7 
0

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

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