Regex 如何匹配使用正则表达式时发生的子条件?
大家好,我正在尝试使用正则表达式匹配以下条件:Regex 如何匹配使用正则表达式时发生的子条件?,regex,Regex,大家好,我正在尝试使用正则表达式匹配以下条件: 字符串以P开头 然后是以下内容之一:- --------从0到9再加上D的和或数字出现一次 --------&或0-9后接M的数字出现一次 --------&或0-9中的数字后跟Y出现一次 --------&或T后跟以下内容之一:- ------------------------------------------从0到9再加上H的和或数字出现一次 ------------------------------------------从0到9再加上
--------&或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,但我编辑这篇文章是为了说明我想要和/或不想要