0

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

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

谢谢你。

4

1 回答 1

1

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

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

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

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

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

foo(255/255)
foo(/)

甚至:

)/-

只是因为它在某处包含斜线,不一定在您想要的位置。

明确您的要求。

于 2012-04-07T18:25:46.390 回答