Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何匹配使用正则表达式时发生的子条件?_Regex - Fatal编程技术网

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

Regex 如何匹配使用正则表达式时发生的子条件?,regex,Regex,大家好,我正在尝试使用正则表达式匹配以下条件: 字符串以P开头 然后是以下内容之一:- --------从0到9再加上D的和或数字出现一次 --------&或0-9后接M的数字出现一次 --------&或0-9中的数字后跟Y出现一次 --------&或T后跟以下内容之一:- ------------------------------------------从0到9再加上H的和或数字出现一次 ------------------------------------------从0到9再加上

大家好,我正在尝试使用正则表达式匹配以下条件:

  • 字符串以P开头
  • 然后是以下内容之一:-
  • --------从0到9再加上D的和或数字出现一次
    --------&或0-9后接M的数字出现一次
    --------&或0-9中的数字后跟Y出现一次
    --------&或T后跟以下内容之一:-
    ------------------------------------------从0到9再加上H的和或数字出现一次
    ------------------------------------------从0到9再加上M的和或数字出现一次
    ------------------------------------------从0到9再加上S的和或数字出现一次
  • 我试图成功地使用以下内容:-

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

    我不确定我是否完全理解你的规格,但这是接近吗

    P([0-9]+D)?([0-9]+M)?([0-9]+Y)?(T([0-9]+H)?([0-9]+M)?([0-9]+S)?)?
    
    所有内容都是可选的,除了前导p、订单事项,每个部分只能出现 一次,每种情况下使用的位数为一个或多个。如果有什么需要的话 包括在内之后

    上面的RE与“p”和“PT”匹配,而规范可能要求p和T后面至少有一个可选组件。使用grep-p(对于Perl正则表达式)的lookahead,我们可以要求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          
    $ 
    

    你为什么把
    P
    标记为可选的?将你的regexp锚定到行的开头和结尾。你是对的,我不希望它是可选的@Barmarhow关于
    ^P([0-9]+[DMY]|T[0-9]+[HMS])
    谢谢@alphabravo,但我编辑这篇文章是为了说明我想要和/或不想要