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


Regexp to match "foo/bar" and not "foobar" wanted

我正在寻找一个正则表达式,我可以在我的分词器中使用它来编译配置文件。以下是 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"是"混合"。

我如何在一个模式中写下这个"和不"?

谢谢。

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

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

因此,这使您可以大致了解如何在匹配ab/c时拒绝像abc这样的令牌。 这与区分浮点常量和整数常量非常相似。

您可能应该将像foo/bar(255)这样的输入标记为四个标记:foo/bar ( 255)

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

foo(255/255)
foo(/)

甚至:

)/-

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

明确您的要求。