2013-02-22 150 views
6

的数量。如果我有这样的一个字符串...C#验证字符串包含括号匹配

"123[1-5]553[4-52]63244[19-44]" 

...什么是验证下列条件的最佳方式:

  1. 每天开放托架有一个匹配的闭括号
  2. 有不超过3 组括号
  3. 嵌套括号(即[123- [4] 9])

正则表达式能够验证所有这些场景吗?如果不是,那么LINQ怎么样?

+0

我认为正则表达式可以工作并返回所有''[']'所包含的匹配项。如果我用正则表达式更好,我会给你一些工作。 ;) – IAbstract 2013-02-22 20:40:44

+0

@mbeckish链接的问题确实地址#1以上,但不是#2或#3,所以我不认为它是一个确切的副本。我想禁止嵌套括号,而链接的问题明确包含它们。 – user685869 2013-02-22 20:57:22

回答

9

因为你不允许嵌套,你可以使用正则表达式:

^([^[\]]*\[[^[\]]*\]){0,3}[^[\]]*$ 

说明:

  • (...){0,3}比赛多达三套如下:
    • [^[\]]*匹配可选非括号字符
    • \[比赛[以打开一组
    • [^[\]]*匹配可选的组内的非括号字符
    • \]匹配]关闭组后所有组
  • 最后,[^[\]]*匹配多种任选的非括号字符
+0

当我使用regexhero(.NET测试程序)测试时,它似乎不是有效的。重复中的第一个数字是必要的。 – nhahtdh 2013-02-22 20:42:43

+0

@nhahtdh:我不知道,谢谢 – SLaks 2013-02-22 20:43:03

+0

@SLaks非常感谢你的正则表达式,但更重要的是,对它的一个很好的解释。 – user685869 2013-02-22 21:04:29

5

要做到这一点,最快的方式将只是遍历字符串

bool Validate(string input) 
{ 
    int braceBalance = 0; 
    int openCount = 0; 
    for (int i = 0; i < input.Length; i++) 
    { 
     if (input[i] == '[') 
     { 
      braceBalance++; 
      openCount++; 
     } 
     if (openCount > 3) return false; // More than 3 pairs 
     if (input[i] == ']') braceBalance--; 
     // Check for nesting: 
     if (braceBalance < -1 || braceBalance > 1) return false; 
    } 
    return (braceBalance == 0); // Check for equal number of opening and closing 
} 

正则表达式和LINQ都将有比这更大的成本(虽然这取决于你的应用程序,这可能并不重要)。

+0

感谢您的好评!我不需要经常验证这类数据,并且字符串相对较短,所以正则表达式的额外开销对我而言是可以接受的。 – user685869 2013-02-22 21:06:46

+0

通常情况下,RegEx在这种情况下非常有用。 – 2013-02-22 21:37:11

1

只是为了看它是否会是合理的,这里是一个LINQ:Y解决方案:

bool[] b = 
    input.Where(c => c == '[' || c == ']') 
    .Select((c,i) => (c == '[') == (i % 2 == 0)) 
    .ToArray(); 

bool valid = b.Length % 2 == 0 && b.Length <= 6 && b.All(i => i); 

它过滤掉[]个字符,然后检查是否只有交替括号(从[开始),即偶数,但不超过6个。

相关问题