复杂正则表达式无法验证一个特定规则的所有重复项

时间:2019-01-24 16:08:16

标签: regex postgresql

我需要帮助来使用正则表达式验证字段。它将在Postgres 9.5中运行。

规则是

  • 字符串必须包含所有七个服务:机油,刮水片,空气滤清器,轮胎,电池,制动器,防冻剂
  • 所有服务都必须有营业时间,可接受的值为HH [:MM] {am | pm} -HH [:MM] {am | pm},或文字“工作时间”,“几小时后”,“不可用” (这是我找不到解决方案的规则)
  • 不区分大小写,并且空格不相关。
  • 服务之间用管道隔开,服务和工作时间之间用冒号隔开

我做了正则表达式:

^(?=.*(Oil))(?=.*(Wiper blades))(?=.*(Air filter))(?=.*(Tires))(?=.*(Battery))(?=.*(Brake))(?=.*(Antifreeze))(?=.*(\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)\s{0,}-\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)|working hours|after hours|not availabl)).+

正则表达式的这一部分仅验证一个序列,而不是所有七个序列。

(?=.*(\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)\s{0,}-\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)|working hours|after hours|not availabl))

好的字符串示例

Oil:8AM-10PM|Wiper blades:8 AM -10 PM|Air filter:8AM-10pm|Tires:8AM-10PM|Battery:8AM-10PM|Brake:8AM-9PM|Antifreeze:not available

错误字符串示例

Oil:8AM-10PM|Wiper blades:8AM-10PM|Air filter:8AM-10PM|Tires:8AM-10PM|Battery:8AM-10PM|Brake:8AM-9PM|Antifreeze:fsdfdsfs

Oil:8AM-10PM|Wiper blades:8AM-10PM|Air filter:8AM|Tires:8AM-10PM|Battery:8AM-10PM|Brake:8AM-9PM|Antifreeze:

Oil:8AM-10PM|Wiper blades:8AM-10PM|Air filter:8AM-10PM|Tires:8AM-10PM|Battery:|Brake:|Antifreeze:8AM-9PM

Oil:8AM-10PM|Wiper blades:8AM-10PM

有人知道缺少什么来验证这七个事件吗?

1 个答案:

答案 0 :(得分:1)

我制作了另一个有效的正则表达式:

^(((oil|Air\ filter|Wiper\ blades|Tires|Battery|Brake|Antifreeze):((((\d{1,2})((A|P)M)(-?)){2})|(not available))(\|?)){7})$


但是,此正则表达式不会进行重复计数。这意味着您可以两次使用Oil仍然可以使用。
I've create a regex101,如果您想测试更多案例。