c#验证字符串是否包含匹配数量的方括号
本文关键字:方括号 包含匹 验证 字符串 是否 | 更新日期: 2023-09-27 18:00:42
如果我有这样的字符串。。。
"123[1-5]553[4-52]63244[19-44]"
验证以下条件的最佳方法是什么:
- 每个开放括号都有一个匹配的闭合括号
- 括号不超过3个组
- 有没有嵌套括号(即[123-[4]9])
正则表达式能够验证所有这些场景吗?如果没有,LINQ怎么样?
因为不允许嵌套,所以可以使用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个。