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

bmt*_*033 6 c# regex linq string validation

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

"123[1-5]553[4-52]63244[19-44]"
Run Code Online (Sandbox Code Playgroud)

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

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

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

SLa*_*aks 9

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

^([^[\]]*\[[^[\]]*\]){0,3}[^[\]]*$
Run Code Online (Sandbox Code Playgroud)

说明:

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


Eri*_* J. 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
}
Run Code Online (Sandbox Code Playgroud)

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