的数量。如果我有这样的一个字符串...C#验证字符串包含括号匹配
"123[1-5]553[4-52]63244[19-44]"
...什么是验证下列条件的最佳方式:
- 每天开放托架有一个匹配的闭括号
- 有不超过3 组括号
- 有无嵌套括号(即[123- [4] 9])
正则表达式能够验证所有这些场景吗?如果不是,那么LINQ怎么样?
的数量。如果我有这样的一个字符串...C#验证字符串包含括号匹配
"123[1-5]553[4-52]63244[19-44]"
...什么是验证下列条件的最佳方式:
正则表达式能够验证所有这些场景吗?如果不是,那么LINQ怎么样?
因为你不允许嵌套,你可以使用正则表达式:
^([^[\]]*\[[^[\]]*\]){0,3}[^[\]]*$
说明:
(...){0,3}
比赛多达三套如下:
[^[\]]*
匹配可选非括号字符\[
比赛[
以打开一组[^[\]]*
匹配可选的组内的非括号字符\]
匹配]
关闭组后所有组[^[\]]*
匹配多种任选的非括号字符 当我使用regexhero(.NET测试程序)测试时,它似乎不是有效的。重复中的第一个数字是必要的。 – nhahtdh 2013-02-22 20:42:43
@nhahtdh:我不知道,谢谢 – SLaks 2013-02-22 20:43:03
@SLaks非常感谢你的正则表达式,但更重要的是,对它的一个很好的解释。 – user685869 2013-02-22 21:04:29
要做到这一点,最快的方式将只是遍历字符串
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
}
正则表达式和LINQ都将有比这更大的成本(虽然这取决于你的应用程序,这可能并不重要)。
感谢您的好评!我不需要经常验证这类数据,并且字符串相对较短,所以正则表达式的额外开销对我而言是可以接受的。 – user685869 2013-02-22 21:06:46
通常情况下,RegEx在这种情况下非常有用。 – 2013-02-22 21:37:11
只是为了看它是否会是合理的,这里是一个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个。
我认为正则表达式可以工作并返回所有''[']'所包含的匹配项。如果我用正则表达式更好,我会给你一些工作。 ;) – IAbstract 2013-02-22 20:40:44
@mbeckish链接的问题确实地址#1以上,但不是#2或#3,所以我不认为它是一个确切的副本。我想禁止嵌套括号,而链接的问题明确包含它们。 – user685869 2013-02-22 20:57:22