我正在尝试验证复杂的正则表达式,但我不太确定如何从我的方法开始。我使用正则表达式测试器来更改不同的东西,但这有点复杂。我正在使用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
我创建了一个正则表达式测试器来测试事情,如果这样做更容易。
答案 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])%(?:[;,]|$))*)*$
总体来说,零件看起来像
^
字符串的开头\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次以上$
字符串结尾