Regex 正则表达式与123.45、E123.4和V12.34匹配

Regex 正则表达式与123.45、E123.4和V12.34匹配,regex,Regex,我正在尝试创建一个与上面列出的3种模式匹配的正则表达式。我可以为这3个正则表达式中的任何一个创建一个工作正则表达式,但我的问题是创建一个能与这4个正则表达式一起工作的正则表达式。下面是允许的值,其中D是任何数字,“.”永远不会作为尾随字符出现(即DDD.无效)。V和E也指那些特定的字符 ddd 滴滴涕 ddd.dd Vdd Vdd.d Vdd.dd 埃迪 Eddd.d 其他所有内容都应无效,例如: d dd 五 Vd Vdd。(尾随“.”) E 埃迪 我对正则表达式不太在行,但我可以将

我正在尝试创建一个与上面列出的3种模式匹配的正则表达式。我可以为这3个正则表达式中的任何一个创建一个工作正则表达式,但我的问题是创建一个能与这4个正则表达式一起工作的正则表达式。下面是允许的值,其中D是任何数字,“.”永远不会作为尾随字符出现(即DDD.无效)。V和E也指那些特定的字符

  • ddd
  • 滴滴涕
  • ddd.dd
  • Vdd
  • Vdd.d
  • Vdd.dd
  • 埃迪
  • Eddd.d
其他所有内容都应无效,例如:

  • d
  • dd
  • Vd
  • Vdd。(尾随“.”)
  • E
  • 埃迪
我对正则表达式不太在行,但我可以将以V开头的条目的部分模式描述为:

V[0-9]{2,2}(\.[0-9]{1,2})?
我可以为entires的全数字部分和条目的E前缀部分编写非常类似的语句。问题是如何将所有3个元素组合成一个正则表达式,而不让我头晕目眩。什么是匹配所有3种模式的好正则表达式

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

(E\d|(V|\d))\d{2,2}(\.\d)?(?(2)\d?|)
E加一位数字,或V,或一位数字,后跟两位数字,然后是通常的十进制数字

E必须有三个非十进制数字,V必须有2个,数字本身必须有三个

如果V或一位数字在开始时匹配(即不是“E”),则允许在后面增加一位数字

(\d{3}(\.\d{1,2})?)|(V\d{2}(\.\d{1,2})?)|(E\d{3}(\.\d)?)
E加一位数字,或V,或一位数字,后跟两位数字,然后是通常的十进制数字

E必须有三个非十进制数字,V必须有2个,数字本身必须有三个

如果V或一位数字在开始时匹配(即不是“E”),则允许在后面增加一位数字

(\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)?
表示三位数字后跟一个可选句点和一位数字

然后我用()将它们包围起来,并用|(或)将它们组合起来

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

\d{3}(\.\d{1,2})?
表示三位数字,可选后跟与1或2位数字匹配的句点

V\d{2}(\.\d{1,2})?
表示V,后跟两位数字(可选句点)和一位或两位数字

E\d{3}(\.\d)?
表示三位数字后跟一个可选句点和一位数字


然后我用()将它们包围起来,并用|(or)将它们组合起来。

使用三个不同的正则表达式没有什么错,是吗

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

这在将来可能会更易于维护。

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

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

这在将来可能更易于维护。

如果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

如果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


E和V后面只能跟一个小数点后的数字(至少从帖子上看是这样)。这允许Eddd。DDD修复了它。现在Eddd.d是不允许的。E和V后面只能跟一位小数点后的数字(至少从帖子上看是这样)。这允许Eddd。DDD修复了它。现在,Eddd.d是不允许的。在一行上用反斜杠加上四个空格,使其成为代码而不是标记。这看起来非常接近我的需要-我忘了包括Vdd.dd,正如我在编辑的帖子中提到的,但这看起来很棒!现在应该解决那个案子了,我错了。现在它是固定的——当我的意思是\d{1,2}时,我放了\d{1,2})顺便说一句,我认为你可以花很多时间把一个regexp归结为一个表达式,但通常它足以涵盖基本情况,或者将它们与|结合起来——很多时候,当你在不接触代码三个月后不得不修改代码时,这更容易弄清楚它在做什么用反斜杠将其视为代码而不是标记,这看起来非常接近我所需要的内容-我忘记了在编辑的帖子中提到的Vdd.dd,但除此之外,这看起来很棒!现在应该解决那个案子了,我错了。现在它是固定的——当我的意思是\d{1,2}时,我放了\d{1,2})顺便说一句,我认为你可以花很多时间将一个regexp归结为一个表达式,但通常它足以涵盖基本情况,或者将它们与|结合起来——很多时候,当你在三个月后不得不修改代码时,这更容易弄清楚它在做什么devexpress silverlight控件工具箱的掩码字段,它只接受单个字符串。但是,是的,否则我想将它们分开。我使用正则表达式作为devexpress silverlight控件工具箱的掩码字段,它只接受单个字符串。但是是的,否则我想把它们分开。谢谢你的解释,这很有帮助。是的,如果这些奇怪的案例不存在,我的生活会轻松一点;)我不得不为我忘记的额外案例做一些编辑,但这一个完全有效。泰。谢谢你的解释,这很有帮助。是的,如果这些奇怪的案例不存在,我的生活会轻松一点;)我不得不为我忘记的额外案例做一些编辑,但这一个完全有效。泰。(\d{3}(\.\d{1,2})|(V\d{2}(\.\d{1,2})|(E\d{3}(\.\d)|)