c#验证字符串是否包含匹配数量的方括号

本文关键字:方括号 包含匹 验证 字符串 是否 | 更新日期: 2023-09-27 18:00:42

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

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

验证以下条件的最佳方法是什么:

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

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

c#验证字符串是否包含匹配数量的方括号

因为不允许嵌套,所以可以使用regex:

^([^[']]*'[[^[']]*']){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个。