c#validation该字符串是否包含匹配的括号

如果我有这样的字符串……

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

…validation以下条件的最佳方法是什么:

  1. 每个开放式支架都有一个匹配的近支架
  2. 不超过3组括号
  3. 没有嵌套括号(即[123- [4] 9])

正则表达式能够validation所有这些场景吗? 如果没有,LINQ怎么样?

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

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

说明:

  • (...){0,3}最多匹配以下三组:
    • [^[\]]*匹配可选的非括号字符
    • \[匹配[打开一个组
    • [^[\]]*匹配组内可选的非括号字符
    • \]匹配]关闭组
  • 最后, [^[\]]*匹配所有组之后的更多可选非括号字符

执行此操作的最快方法是迭代字符串

 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 } 

RegEx和Linq都会有比这更大的开销(尽管取决于你的应用程序,这可能无关紧要)。

只是为了看看它是否合理,这是一个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个。