RegEx匹配123.45和E123.4和V12.34

时间:2009-08-06 18:10:33

标签: regex

我正在尝试创建一个与上面列出的3种模式匹配的RegEx。我可以为这些中的任何一个创建一个有效的RegEx,但我的问题是创建一个适用于所有这四个的。允许的值低于,其中D是任何数字和'。'永远不会作为尾随字符出现(即DDD。无效)。 V和E也指那些特定的字符。

  • DDD
  • ddd.d
  • ddd.dd
  • VDD
  • Vdd.d
  • Vdd.dd
  • Eddd
  • Eddd.d

其他所有内容都应无效,例如:

  • d
  • DD
  • V
  • Vd的
  • VDD。 (尾随'。')
  • 电子
  • 埃德

我对RegEx不太满意,但我可以用以V开头的条目描述这种模式的一部分,如下所示:

V[0-9]{2,2}(\.[0-9]{1,2})?

我可以为entires的全数字部分和条目的E前缀部分编写非常相似的语句。问题是如何将所有3组合成一个RegEx,它不会使我的头部旋转阅读。什么是一个很好的RegEx匹配所有3种模式?

编辑:我忘了包含格式Vdd.dd

4 个答案:

答案 0 :(得分:1)

(E\d|(V|\d))\d{2,2}(\.\d)?(?(2)\d?|)

E有一个数字,或V,或一个数字,后跟两位数字,然后是通常的小数位。

E必须有三个非十进制数字,V必须有2个,而自己的数字必须有三个。

如果V或单个数字在开头匹配(I.E.不是'E'),则后方允许额外的数字。

答案 1 :(得分:1)

(\d{3}(\.\d{1,2})?)|(V\d{2}(\.\d{1,2})?)|(E\d{3}(\.\d)?)

编辑:一些解释:我刚刚匹配了所有3种不同的格式:

\d{3}(\.\d{1,2})?

表示三个数字后跟一个匹配1或2位的句点。

V\d{2}(\.\d{1,2})?

表示V后面跟两个数字,可选周期和一个或两个数字

E\d{3}(\.\d)?

表示三位数后跟一个带有单个数字的可选句点

然后我只用()包围每一个并将它们全部与|组合(或)。

答案 2 :(得分:1)

有三种不同的正则表达式没有错,是吗?

\d{3}(.\d{1,2)?
V\d{2}(.\d)?
E\d{3}(.\d)?

这将来可能会更加可维护。

答案 3 :(得分:1)

如果Eddd无效,那就更容易了:

[EV\d]\d{2}(\.\d{0,2})?

同样,如果Vddd有效:

[EV\d]\d{2,3}(\.\d{0,2})?

完全匹配你所拥有的东西有点困难:

(\d{3}(\.\d{1,2})?)|(V\d{2}(\.\d)?)|(E\d{3}(\.\d)?)

确保您测试完全匹配,否则

V123.1

将匹配为

V12