复杂的正则表达式模式验证

时间:2019-09-09 14:38:20

标签: regex

我正在尝试验证复杂的正则表达式,但我不太确定如何从我的方法开始。我使用正则表达式测试器来更改不同的东西,但这有点复杂。我正在使用Angular的Validator.pattern验证此文本输入。

我正在测试验证的字符串是:

1;D;00:00|04:59|5%;05:00|8:59|35%;09:00|14:59|35%;15:00|23:59|25%,2;D;00:00|04:59|5%;05:00|14:59|30%;15:00|23:59|65%

它的分解方式是在对象之间用逗号分隔,并且每个对象都有用分号分隔的不同部分

第一部分: 1,它可以是任何正整数,我的最佳猜测是类似^\d+$的东西?

第二部分: D,可以是A或D,例如:[AD]

第三部分: 00:00|04:59|5%;05:00|8:59|35%;09:00|14:59|35%;15:00|23:59|25%,这部分最复杂。它需要2个时间范围,然后是0-100%之间的百分比,每个部分都由|分隔符分隔。理想情况下,这些范围的总和应为100%,时间范围不应重叠,但是可以在单独的服务中进行验证,我只是希望现在就可以使用正确的格式。因此,只要输入两个时间范围和一个百分比,它就会被接受。

https://regex101.com/r/hPXPE8/1

我创建了一个正则表达式测试器来测试事情,如果这样做更容易。

1 个答案:

答案 0 :(得分:0)

您可以使用该模式来匹配开头的\d+;[AD];

使用(?:[01]?[0-9]|2[0-3]):[0-5][0-9]匹配时间部分,并使用\|匹配管道。

使用(?:100|[1-9]?[0-9])%匹配0-100百分比部分,使用字符类[;,]匹配;,

通过重复的部分将它们组合成更大的样式,您可以使用:

^\d+;[AD];(?:(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\|(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\|(?:100|[1-9]?[0-9])%[;,])*(?:\d+;[AD];(?:(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\|(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\|(?:100|[1-9]?[0-9])%(?:[;,]|$))*)*$

Regex demo

总体来说,零件看起来像

  • ^字符串的开头
  • \d+;[AD];比赛开始模式
  • (?:非捕获组
    • (?:[01]?[0-9]|2[0-3]):[0-5][0-9]\|匹配时间模式2倍
    • (?:100|[1-9]?[0-9])%[;,]匹配百分比0-100
  • )*关闭组并重复0次以上
  • (?:非捕获组
    • \d+;[AD];比赛开始模式
    • (?:非捕获组
      • (?:[01]?[0-9]|2[0-3]):[0-5][0-9]\|匹配时间模式2倍
      • (?:100|[1-9]?[0-9])%匹配百分比0-100
      • (?:[;,]|$)匹配;,或字符串结尾
    • )*关闭组并重复0次以上
  • )*关闭组并重复0次以上
  • $字符串结尾