asp.net使用正则表达式验证包含打开/关闭括号片段的属性字符串

时间:2017-05-24 15:11:24

标签: c# asp.net regex validation

我遇到与this issue类似的问题 我们有自定义语法来插入'引用',它使用双方括号。在这个括号中只能是数字(正1,2或负-2,-3)。

现在问题是:我们需要验证包含此引用的字符串。 如果string不包含引用 - 它是有效的。如果string包含有效引用 - 它也是有效的。如果至少有一个引用无效(比如缺少结束括号,内部没有数字)则无效。

我可以轻松创建符合我们的参考语法的表达式[[ - ?[[0-9]]]'并提取它们,但不知道如何将其转换为RegExp进行验证(排除缺少的端括号,非数字等)。

我们希望在ASP.NET中使用Data Annotation验证属性,以便它可以同时支持C#/ javascript验证。最好在客户端/服务器端使用一个正则表达式而不是两个重复的.IndexOf解决方案(通常不是要实现的问题)来验证。

以下是一些示例值: test string valid - 有效

test string valid [[1]] [[-22]] - 有效

[[0]] test string vali[[1]][[-22]] - 有效

test[[ - 无效

test [[1[[2]]]] - 无效

test [[1a]] - 无效

test [[1]]]] - 无效

2 个答案:

答案 0 :(得分:0)

\[\[\-?\d+\]\]这样的东西至少接近你想要的东西,但它也匹配test [[1[[2]]]],你说这是无效的。你能澄清为什么不匹配,以便我可以相应地修改这个正则表达式吗?

更新:根据您对不允许嵌套括号的说明,try这个:(?<!\[)(\[\[\-?\d+\]\])(?!\])

答案 1 :(得分:0)

也许这不是你想要的,但它适用于你的所有情况:

string pattern = @"\[[?>\[[?<c>]|[^[]]+|\][?<-c>]]*[?[c][?!]]\]";
string testString = "[[0]] test string vali[1][[-22]]";
int count = testString.Split('[').Length - 1;
MatchCollection matches = Regex.Matches(testString,pattern);
Console.WriteLine("Matches {0}",matches.Count);
Console.WriteLine("Count {0}", count);
if(count == matches.Count){
      Console.WriteLine("Valid");
}
else{
      Console.WriteLine("Invalid");
}
相关问题