前瞻性,正则表达式中的后视条件

时间:2012-07-30 11:10:32

标签: php regex pcre regex-lookarounds

以下示例是关于使用先行断言作为条件。我在PHP手册中找到了它:http://www.php.net/manual/en/regexp.reference.conditional.php

(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

以下是有关此正则表达式的说明:

  

条件是一个积极的先行断言,匹配可选的非字母序列后跟一个字母。换句话说,它测试受试者中是否存在至少一个字母。如果找到了一封信,则该主题与第一个替代方案相匹配;否则它与第二个相匹配。此模式匹配两种形式之一dd-aaa-dd或dd-dd-dd中的字符串,其中aaa是字母,dd是数字。

有人能告诉我为什么我们使用先行断言作为本例中的条件?为什么我们不使用lookbehind断言?当他们被用作这样的条件时我感到困惑,因为我不知道他们如何匹配主题字符串。提前谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,我们使用先行断言来决定使用哪个正则表达式。看起来它正在决定表单01-Jan-1201-01-12的匹配日期。前瞻性断言会查看我们尝试匹配的内容中是否有任何字母,如果是,请使用\d{2}-[a-z]{3}-\d{2}尝试匹配01-Jan-12如果不是,则使用\d{2}-\d{2}-\d{2}来尝试匹配{ {1}}。