我需要验证此格式的数据输入的文本框 -
“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有效
答案 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]+)*$
或简化
[^-]+-[^,]+(,[^-]+-[^,]+)*
[^ - ]这意味着任何不是“ - ”
的东西