asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串
Posted
技术标签:
【中文标题】asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串【英文标题】:asp.net validate property string that contains open/closing bracket fragments using regex 【发布时间】:2017-10-25 00:48:30 【问题描述】:我有类似this issue 的问题 我们有用于插入“引用”的自定义语法,它使用双方括号。括号内只能是数字(正数 1,2 或负数 -2, -3)。
现在的问题是:我们需要验证包含此引用的字符串。 如果字符串不包含引用 - 它是有效的。如果字符串包含有效的引用 - 它也是有效的。如果至少有一个引用无效(例如缺少端括号,内部没有数字),则该引用无效。
我可以轻松地创建与我们的引用语法匹配的表达式 '[[-?[[0-9]]]' 并提取它们,但不知道如何将其转换为正则表达式进行验证(以排除缺少的端括号,非数字等)。
我们希望在 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]]]]
- 无效
【问题讨论】:
我相信您正在寻找或类似^[^\][]*(?:\[\[-?\d+]][^\][]*)*$
。在 JS 和 C# 中的工作方式相同。还匹配一个空字符串 - 不确定这是一个问题。
非常感谢。它几乎可以工作。不知何故,它只在测试字符串 [1] 上失败,这不在我的原始请求中,但也应该是有效字符串,因为它与我们的语法无关
但它用单括号括起来,这使问题不清楚。 ^[^\][]*(?:(?:\[\[-?\d+]]|\[-?\d+])[^\][]*)*$
可能有用,但我现在更不确定您需要什么。
我需要的是:如果出现 [[(双方括号)之后的任何内容,都应该是数字(负/正),并通过 ]] 结束。另一个 [[ 内部没有内部 [[ 语法。所有其他文本应该是 - 普通文本。有可能有单括号[,用单括号括起来的值等[1]。因此,如果出现 [[ - 根据我们的语法开始验证,直到 ]]。否则 - 它可以是任何普通文本。
您似乎需要一个否定模式(匹配除某些模式之外的所有内容)。请问可以制定吗?我建议使包含[[
的每个字符串都失败,这些字符串后面没有紧跟可选的-
、1+ 位和]]
。见^(?!.*\[\[(?!-?\d+]]))
。
【参考方案1】:
也许这不是您想要的,但它适用于您的所有情况:
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");
【讨论】:
你为什么有IgnorePatternWhiteSpace
?该设置仅用于注释模式。它对文本的实际正则表达式解析没有任何作用。
谢谢。但无论如何,为了有效性,您将拆分计数与正则表达式计数进行比较。理想情况下,我想要一个可以传递给 RegularExpressionValidator 的正则表达式,如果文本匹配,则它有效,否则无效。但我更多地考虑问题,看起来它会非常复杂且难以支持。【参考方案2】:
\[\[\-?\d+\]\]
之类的东西至少与您想要的很接近,但它也与您所说的无效的 test [[1[[2]]]]
匹配。你能解释一下为什么不应该匹配,以便我可以相应地修改这个正则表达式吗?
更新:根据您关于不允许嵌套括号的说明,try 此:(?<!\[)(\[\[\-?\d+\]\])(?!\])
。
【讨论】:
通常它和我在原始文本中写的一样(只是不知何故我的斜线被堆栈转义了,你只是用 d+ 替换了 0-9)。 1. 它不应该匹配,因为引用不能在另一个内部。以上是关于asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串的主要内容,如果未能解决你的问题,请参考以下文章