如何匹配使用正则表达式发生一次的子条件?

时间:2014-10-06 00:39:13

标签: regex

大家好我正试图使用​​正则表达式来匹配以下条件:

  1. 字符串以P
  2. 开头
  3. 后跟以下之一: -
  4. --------& OR编号从0到9后跟D出现一次  --------&安培; OR编号从0到9后跟M出现一次  --------&安培; OR编号从0到9后跟Y出现一次  --------&安培;或者T后跟以下之一: -
     ------------------------------------------& OR编号从0到9后跟H出现一次 ------------------------------------------& OR编号从0到9后跟M出现一次 ------------------------------------------& OR编号从0到9后跟S出现一次
  5. 我尝试使用以下成功: -

    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)?)?$/
    

1 个答案:

答案 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          
$