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 此:(?&lt;!\[)(\[\[\-?\d+\]\])(?!\])

【讨论】:

通常它和我在原始文本中写的一样(只是不知何故我的斜线被堆栈转义了,你只是用 d+ 替换了 0-9)。 1. 它不应该匹配,因为引用不能在另一个内部。

以上是关于asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 电子邮件验证器正则表达式

识别密码验证的单词变体[关闭]

使用正则表达式的 ASP.NET C# 客户端和服务器端验证

默认 ASP.NET Core 身份密码的正则表达式

asp.net中验证控件的使用方法

电子邮件地址验证。这有效吗?