代码之家  ›  专栏  ›  技术社区  ›  Maurício Pontalti Neri

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

  •  0
  • Maurício Pontalti Neri  · 技术社区  · 5 年前

    我需要帮助使用正则表达式验证字段。它将在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 回复  |  直到 5 年前
        1
  •  1
  •   Nicolas    5 年前

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


    然而,这个正则表达式不计算重复次数。也就是说,你可以用两次油,它仍然有效。
    I've create a regex101 如果您希望测试更多案例。