c#validation该字符串是否包含匹配的括号
如果我有这样的字符串……
"123[1-5]553[4-52]63244[19-44]"
…validation以下条件的最佳方法是什么:
- 每个开放式支架都有一个匹配的近支架
- 不超过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个。