自定义命令格式的正则表达式验证

时间:2013-11-15 09:25:18

标签: c# regex validation

我需要使用与此

类似的格式验证一些命令
"/a foo.bar /b bar.foo /c 01(.01)"

其中final(.01)是可选的(括号用于将内容标记为可选)。可以设置任何数字而不是0和1。开关/ a,/ b,/ c也是固定的 目前,我已经开发了这个正则表达式:

@"/a\s*([\w\W]*)\s*/b\s*([\w\W]*)\s*/c\s*[0-9,0-9,(.,0-9,0-9){0,1}]

但由于某种原因,如果命令是例如

"/a foo.bar /b bar.foo /c 01.", 

它仍然可以对正则表达式进行验证。有效命令应以2digits.2digits或简单的2digits结束。

有人可以帮我解决这个问题吗?

干杯,

Alex Barac

2 个答案:

答案 0 :(得分:2)

试试这个:

^/a\s*(.*)\s*/b\s*(.*)\s*/c\s*((\d{2}\.\d{2})|(\d{2}))$

Regular expression visualization

Debuggex Demo

答案 1 :(得分:0)

你误解了角色类。例如,这个:

[0-9,0-9,(.,0-9,0-9){0,1}]

和此:

[0-9,.(){}]

意思是同样的事情。换句话说,无论你放在方括号内,该表达式都匹配单个字符,除非你量化字符类。相反,你想要的是:

@"/a\s*([\w\W]*)\s*/b\s*([\w\W]*)\s*/c\s*[0-9][0-9](\(\.[0-9][0-9])){0,1}"

但是,让我帮助您进一步简化和解决这个问题:

  1. 您可以使用.(通配符)而非[\w\W](除非您专门用于匹配换行符,否则默认情况下.不匹配新行)。
  2. 这就是为什么我逃离.你实际上是指一个点,接近结尾的原因。
  3. 括号也是特殊字符,这就是为什么我在接近结束时将它们转义的原因。
  4. \d[0-9]
  5. 的简写
  6. 外部括号是这样您可以在上应用{0,1} 量词
  7. ?{0,1}
  8. 的简写

    考虑到所有这些:

    @"/a\s*(.*)\s*/b\s*(.*)\s*/c\s*\d\d(\(\.\d\d))?"
    

    最后两件事。首先,如果参数之间至少应有一个空格,则应使用\s+而不是\s*。其次,如果您想允许超过两位数,那么您可以\d+代替\d\d