大家好我正试图使用正则表达式来匹配以下条件:
我尝试使用以下成功: -
P?(([0-9]{1,}D)|([0-9]{1,}M)|([0-9]{1}Y)|(T?(([0-9]{1,}H)|([0-9]{1,}M)|([0-9]{1,}S))))
但它符合我之前解决的任何条件的任何给定数量
任何想法我怎么能达到这个正则表达式的条件?
修改
最后我找到了我正在寻找的东西
/^P(?=\w*\d)(?:\d+Y|Y)?(?:\d+M|M)?(?:\d+W|W)?(?:\d+D|D)?(?:T(?:\d+H|H)?(?:\d+M|M)?(?:\d+(?:\.\d{1,2})?S|S)?)?$/
答案 0 :(得分:1)
我不确定我是否完全理解您的规范,但这是否已经接近了?
P([0-9]+D)?([0-9]+M)?([0-9]+Y)?(T([0-9]+H)?([0-9]+M)?([0-9]+S)?)?
一切都是可选的,除了领先的P,订单很重要,每个部分都只能出现 一次,并且在每种情况下使用的位数是一个或多个。如果有的话,T是必需的 在它被包括之后。
上面的RE匹配“P”和“PT”,而规范可能要求至少有一个可选组件跟随P和T.使用lookphead和grep -P(对于Perl正则表达式),我们可以要求P后跟一个数字。
$ RE='P(?=[0-9])([0-9]+D)?([0-9]+M)?([0-9]+Y)?(T(?=[0-9])([0-9]+H)?([0-9]+M)?([0-9]+S)?)?'
$ for s in P1DT5S P1DT5 P1DT P1D P1 P
do
printf "%-10s %s\n" $s $(echo $s | grep -P -o $RE)
done
P1DT5S P1DT5S
P1DT5 P1DT
P1DT P1D
P1D P1D
P1 P
P
$