正则表达式匹配“foo / bar”而非“foobar”想要

时间:2012-04-07 17:59:10

标签: php regex

我正在寻找一个可以在我的tokenizer中用来编译配置文件的正则表达式。这是php中的一个类的片段:

private $token = array(
    "PATH" => "([a-zA-Z\_-]+\.|\*\.)+([a-zA-Z\_-]+|\*)",
    "MIXED" => "[a-zA-Z0-9-_\(\)\/]{2,}",
    "STRING" => "[a-zA-Z-_]{2,}"
);

private function getToken($string) {
    foreach($this->token as $name => $pattern) {
        preg_match("/^".$pattern."/", $string, $match);
        if(!empty($match))
            return array($name, $match[0]);
    }

    return false;
}

“MIXED”应匹配“foo / bar”而不是“foobar”,“STRING”应匹配“foobar”而不是“foo / bar”。目前“foobar”和“foo / bar”是“MIXED”。

我如何以单一模式写下“AND NOT”?

谢谢。

1 个答案:

答案 0 :(得分:1)

此模式将匹配包含至少一个斜杠的任何字母,数字,下划线,连字符和斜杠序列:

[a-zA-Z0-9-_/]*\/[a-zA-Z0-9-_/]*

因此,这可以让您大致了解如何在匹配abc时拒绝ab/c等令牌。这与将浮点常数与整数常量区分开来非常相似。

您可能应该将foo/bar(255)等输入标记为四个令牌:foo/bar ( 255)

否则强制执行此斜杠要求很复杂。天真的方式意味着MIXED可以是这样的:

foo(255/255)
foo(/)

甚至:

)/-

只是因为它在某处包含斜杠,而不一定是你想要的地方。

明确您的要求。