【问题标题】:Regex expression partly validating expression正则表达式部分验证表达式
【发布时间】:2015-09-23 09:32:09
【问题描述】:

我目前正在使用 Java 构建 Web 应用程序,并且我是 regex 的新手。我有以下要求来验证公式:

公式可以包含以下字符集:

  • 数字:0 - 9
  • 阿尔法:A - Z
  • 运算符:*、/、+、-
  • 分隔符:;

条件:

  • 公式必须以“T”开头
  • 字符“T”后面必须始终跟一个数字或字母。
  • 分隔符后面必须始终跟“T”。
  • 字符“M”后面必须始终跟一个运算符。
  • 运算符后面必须始终跟一个数字

我有如下表达式:

^(?!.*[*+/-]\D)(?!.*T\W)(?!.*[;:][^T])(?!.*M[^*+/-])[T][A-Z0-9 +/*;:-]*$

上面的正则表达式满足以下表达式,它是有效的:

TA123;T1*2/32M+

但我不知道如何在上面的正则表达式中添加以下验证:

  • 运算符后面必须始终跟一个数字
  • 字符“T”后面必须始终跟一个数字或字母。
  • 分隔符后必须始终跟“T”
  • 字符“M”后面必须始终跟一个运算符。

上面的正则表达式部分有效地满足了上述条件,只有下面的那些应该是无效的,但它是有效的,这是错误的:

下面的不应该作为运算符工作(*、/、+、-)必须总是后跟一个数字,但在这种情况下它是有效的:

T4R*

下面的不应该作为字符“T”后跟一个数字或字母,但在这种情况下它是有效的:

T4RT

下面的不应该作为分隔符(;)必须始终跟在“T”之后,但在这种情况下它是有效的:

T4;

下面的不应该工作,因为字符“M”必须总是跟在一个运算符之后,但在这种情况下它是有效的:

T4RTM

嗨@vks,

将您的更改应用到 reg 表达式后,请在下面找到结果:

下面的不应该作为运算符工作(*、/、+、-)必须始终后跟一个数字

它适用于字符但不适用于数字,预期的是数字:

T4R*H 无效

有效的 T4R*5

字符“T”后面必须始终跟一个数字或字母:

T4RT 按预期无效 T4RT5应该有效但实际结果无效 T4R应该有效但实际结果无效

分隔符(;) 后面必须始终跟“T”:

T4;T应该有效但实际结果无效 T4;正如预期的那样无效

字符“M”后面必须始终跟一个运算符:

T4RTM+ 应该有效但实际结果无效 T4RTM 按预期无效

知道如何对正则表达式进行哪些更改才能满足上述条件吗?

提前感谢您的帮助

【问题讨论】:

  • TA123;T1*2/32M+ 也是无效的,因为前面没有数字。请添加一些有效的例子

标签: java regex validation


【解决方案1】:

正则表达式是正确的。唯一可能失败的方法是输入后有newline。要解决这个问题,你可以使用

^(?!.*[TM*+/;:-]$)(?!.*[*+/-]\D)(?!.*T\W)(?!.*[;:][^T])(?!.*M[^*+/-])[T][A-Z0-9 +/*;:-]*$

查看演示。

https://regex101.com/r/sS2dM8/51

【讨论】:

  • 您好,感谢您根据新表达式更新的回复问题
  • @user1999453 T4RTM+ 无效,因为 operator.check 编辑后没有数字!!!!!!!!!
  • 很抱歉我犯了 T4RTM+ 的错误,它现在可以正常工作了,非常感谢 vks。
【解决方案2】:

将任务分解成更小的部分,然后一个接一个解决它们。

解决方案可能如下所示:

缺点:

  1. 性能稍差

优点:

  1. 更易于阅读和理解
  2. 更易于维护和扩展
  3. 更容易测试

【讨论】: