如果我有这样的字符串......
"123[1-5]553[4-52]63244[19-44]"
...验证以下条件的最佳方法是什么:
- 每个开括号都有一个匹配的右括号
- 不超过3组括号
- 没有嵌套括号(即 [123-[4]9] )
正则表达式是否能够验证所有这些场景?如果没有,那么 LINQ 怎么样?
如果我有这样的字符串......
"123[1-5]553[4-52]63244[19-44]"
...验证以下条件的最佳方法是什么:
正则表达式是否能够验证所有这些场景?如果没有,那么 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);
它过滤掉[
and]
字符,然后检查是否只有交替的括号(以 开头[
)、偶数且不超过 6 个。