【问题标题】:Regex validation for custom command format自定义命令格式的正则表达式验证
【发布时间】:2013-11-15 09:25:18
【问题描述】:

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

"/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 结尾。

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

干杯,

亚历克斯·巴拉克

【问题讨论】:

  • 解析命令行(stackoverflow.com/questions/491595/…),让库负责解析和检查类型不是更容易吗?然后您只需要检查设置的选项 a、b 和 c 的结果。
  • 好建议,但我正处于一种时间危机中,我需要尽快解决这种问题......

标签: c# regex validation


【解决方案1】:

试试这个:

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

Debuggex Demo

【讨论】:

  • 谢谢,正是我想要的!我希望我可以将您的答案两次添加到可视正则表达式测试器的链接。
  • 很好的正则表达式表示。 +1
  • a*? Zero or more a's (lazy),其实不需要,我删了。
【解决方案2】:

您误解了字符类。例如,这个:

[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} 量词
  6. ?{0,1} 的简写。

考虑到所有这些:

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

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

【讨论】:

  • 嗯,这就是我遇到问题的部分。我应该如何正确量化 .digitdigit 类型的表达式出现一次或根本不出现?
  • 这应该有助于我未来的正则表达式开发。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2011-12-02
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多