2012-07-30 66 views
0

以下示例是关于使用前瞻性断言作为条件。我发现它在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是数字。

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

回答

1

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

+0

你能否解释我的第二个问题:为什么在这种情况下我们不使用lookbehind断言? – 2012-07-30 12:41:20

+1

因为我们想知道*事先*我们需要使用哪个正则表达式。如果我们在字符串的开始处使用lookbehind,则没有任何匹配,并且在那之后我们丢失了一些我们想要匹配的数据。 – Gareth 2012-07-30 13:43:03

+0

感谢您的回答! – 2012-07-30 15:26:05