【问题标题】:c# validate that string contains matching number of bracketsc#验证字符串是否包含匹配数量的括号
【发布时间】:2013-02-08 13:52:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我认为正则表达式会起作用并返回[...] 包围的所有匹配项。如果我对正则表达式更好,我会给你一些可以使用的东西。 ;)
  • @mbeckish 链接的问题确实解决了上面的#1,但没有解决#2 或#3,所以我认为它不是完全重复的。我想禁止嵌套括号,而链接的问题特别包含它们。

标签: c# regex string linq validation


【解决方案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 个。

【讨论】:

    【解决方案2】:

    最快的方法就是迭代字符串

    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 都会有比这更大的开销(尽管取决于您的应用程序,这可能无关紧要)。

    【讨论】:

    • 感谢您的出色回答!我不需要经常验证此类数据,而且字符串相对较短,因此正则表达式的额外开销对于我的目的来说是可以接受的。
    • 这种情况经常发生,RegEx 在这种情况下非常有用。
    【解决方案3】:

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

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

    解释:

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

    【讨论】:

    • 当我使用 regexhero(.NET 测试器)进行测试时,它似乎无效。重复中的第一个数字是必需的。
    • @SLaks 非常感谢您提供正则表达式,但更重要的是,感谢您对其进行了很好的解释。
    • 唯一的问题,这也会匹配123[1-5]553[]63244[1aaaaaaaaaaaaaaaaaaa4]
    • @Jason:这应该是有效的。 (换句话说,正则表达式比问题更能表达他的要求)
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多