【问题标题】:Lookahead, lookbehind condition in regular expression正则表达式中的前瞻、后视条件
【发布时间】:2012-07-30 11:10:32
【问题描述】:

以下示例是关于使用先行断言作为条件的。我在 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 是数字。

谁能告诉我为什么我们在这个例子中使用先行断言作为条件?为什么我们不使用后向断言?当它们被用作这样的条件时,我会感到困惑,因为我不知道它们如何匹配主题字符串。提前致谢!

【问题讨论】:

    标签: php regex pcre regex-lookarounds


    【解决方案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

    【讨论】:

    • 你能解释一下我的第二个问题:在这种情况下我们为什么不使用lookbehind断言?
    • 因为我们想事先知道我们需要使用哪个正则表达式。如果我们在字符串的开头使用lookbehind,则没有什么可以匹配的,在那之后我们丢失了一些我们想要匹配的数据。
    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多