一系列带连字符的键值对的正则表达式

时间:2011-06-08 12:33:15

标签: asp.net regex webforms

我需要验证此格式的数据输入的文本框 -

“TeSt12-12TeSt,12Test-AB12,...。”

基本上是一系列键值(关键连字符值)用逗号分隔(,)

Readlike

anyAlphaNumeric后跟连字符anyAlphaNumeric,然后是“可选来自此处”逗号和anyAlphaNumeric,后跟连字符anyAlphaNumeric,然后是逗号和anyAlphaNumeric,后跟连字符anyAlphaNumeric ...

这里1s可以是A-Z,a-z,0-9 例子 - 11-11有效 111-111,无效(逗号后面应该跟另一个键值集) 1-1,1-1有效 1-无效(连字符后缺少值) 1-1,111-111,11-11111,111-111111有效

3 个答案:

答案 0 :(得分:5)

好的:

^        # Start of string
\w+      # Match any alnum,
-        # hyphen,
\w+      # any alnum.
(?:      # Try to match...
 ,       # comma,
 \w+     # any alnum,
 -       # hyphen,
 \w+     # any alnum
)*       # zero or more times.
$        # Match end of string.

或(作为非冗长的正则表达式):

^\w+-\w+(?:,\w+-\w+)*$

请注意\w也会匹配下划线(并且在.NET环境中,也可能匹配Unicode字母和数字。如果您不想这样,请使用[A-Za-z0-9]代替{ {1}}。

答案 1 :(得分:1)

你需要了解一些正则表达式的执行才能构建这样的东西,当涉及到重复(特别是逗号分隔列表)时,你需要经常做一些事情。这应该可以解决问题。

([^-]+-[^,]+)(,[^-]+-[^,]+)*

当你编写正则表达式时,你正在创建一个非常简单的解析器,它将以贪婪的方式从左到右消耗字符。这对您编写正则表达式的方式施加了某些限制。

此代码段转换为以下内容。

  • 匹配以任意数量的非超级字符开头的组,后跟实际的连字符,后跟任意数量的非逗号字符,为此匹配创建一个组
  • 下一组有点有趣,因为匹配只有在逗号分隔对时才能成功。在第二组之前加上逗号,你告诉正则表达式引擎只有在那里有逗号时才继续。其余的都是完全相同的。

每个角色类除了分隔符之外的原因是因为贪婪的正则表达式引擎否则会意识到在给定当前输入的情况下会产生一个决定。大多数正则表达式问题都与对正则表达式的贪婪性质的理解失败有关(也有懒惰的引擎,但它们较慢而且不是真正标准的正则表达式)

您可以像这样重写模式以使其更实用:

(?:(?<key>[^-]+)-(?<value>[^,]+))(?:,(?<key>[^-]+)-(?<value>[^,]+))*

答案 2 :(得分:1)

^[a-zA-Z0-9]+-[a-zA-Z0-9]+(,[a-zA-Z0-9]+-[a-zA-Z0-9]+)*$

或简化

[^-]+-[^,]+(,[^-]+-[^,]+)*

[^ - ]这意味着任何不是“ - ”

的东西