如何将RegEx与not语句匹配

时间:2014-01-26 13:07:11

标签: php regex

我有以下正则表达式,我无法在PHP中匹配日期,但只能以某种格式。我的正则表是:

[^_][0-9]*[-][0-9][0-9]-[0-9][0-9]

我想只匹配

AFM_LU78_8-14-08.pdf

但不是

AFM_LU78_08-14-08.pdf

我尝试了多个其他正则表达式匹配,但尚未找到方法。有人可以帮忙吗?我觉得我错过了一个前瞻性的前瞻?

感谢。

2 个答案:

答案 0 :(得分:0)

如果你只想提取日期,你应该可以使用这样的东西:

(?<=_)[1-9][0-9]?-[0-9]{2}-[0-9]{2}

[1-9][0-9]?确保日期部分中没有前导零,(?<=_)确保在日期之前有下划线。

regex101 demo


我不确定您是否意识到在当前模式中,[^_]与日期中的第一个数字相匹配,您的模式也会匹配AFM_LU78_abc-14-08.pdf之类的内容。< / p>

否则,如果不保证日期在下划线之后,您可以尝试:

(?<=[^0-9])[1-9][0-9]?-[0-9]{2}-[0-9]{2}

[相当于(?<![0-9])[1-9][0-9]?-[0-9]{2}-[0-9]{2}使用负面的后视镜而不是]

确保在日期之前还有其他数字。

regex101 demo


(?<= ... )是一个积极的外观,可以确保内部的内容在随后的模式之前。

答案 1 :(得分:0)

[0-9]-[0-9][0-9]-[0-9][0-9]

这将匹配8但不匹配08。 如果你想匹配18,请使用例如:

1?[0-9]-[0-9][0-9]-[0-9][0-9]

那也是:

1?\d-\d\d-\d\d