我遇到与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]]]]
- 无效
答案 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");
}