我正在寻找一个可以在我的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”?
谢谢。
答案 0 :(得分:1)
此模式将匹配包含至少一个斜杠的任何字母,数字,下划线,连字符和斜杠序列:
[a-zA-Z0-9-_/]*\/[a-zA-Z0-9-_/]*
因此,这可以让您大致了解如何在匹配abc
时拒绝ab/c
等令牌。这与将浮点常数与整数常量区分开来非常相似。
您可能应该将foo/bar(255)
等输入标记为四个令牌:foo/bar
(
255
和)
。
否则强制执行此斜杠要求很复杂。天真的方式意味着MIXED
可以是这样的:
foo(255/255)
foo(/)
甚至:
)/-
只是因为它在某处包含斜杠,而不一定是你想要的地方。
明确您的要求。