3

我需要使用与此类似的格式验证一些命令

"/a foo.bar /b bar.foo /c 01(.01)"

其中最后的 (.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 结尾。

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

干杯,

亚历克斯·巴拉克

4

2 回答 2

2

试试这个:

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

正则表达式可视化

调试演示

于 2013-11-15T09:51:30.593 回答
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. 外括号是这样您可以将{0,1} 量词应用于group
  6. ?是 的简写{0,1}

考虑到所有这些:

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

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

于 2013-11-15T09:41:44.763 回答