2012-04-07 203 views
0

我正在寻找一个正则表达式,我可以在我的令牌化器中使用它来编译配置文件。这里是在PHP代码片段了一类:正则表达式匹配“foo/bar”而不是“foobar”需要

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; 
} 

“混合”应与“富/酒吧”,而不是“foobar的”和“STRING”应与“foobar的”,而不是“富/酒吧”。目前“foobar”和“foo/bar”是“混合”。

我该如何在单个模式中写下“AND NOT”?

谢谢。

+0

“MIXED”=>“[a-zA-Z0-9 -_ \(\)] + \/[a-zA-Z0-9 -_ \(\)] +” – Cougar 2012-04-07 18:01:20

+0

更精确: “MIXED”也是“foo()”,“foo(255)” – Greggel 2012-04-07 18:06:52

+0

Cougar正处于正确的道路上。你想要表达的想法是“至少包含一个斜线”。 – Kaz 2012-04-07 18:18:49

回答

1

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

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

所以这给你一个总体思路如何拒绝像abc令牌,同时匹配ab/c 。这与区分浮点常量和整型常量非常相似。

你或许应该被标记化而输入,比如foo/bar(255)四个令牌:foo/bar(255)

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

foo(255/255) 
foo(/) 

甚至:

)/- 

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

澄清您的要求。

+0

谢谢!这为我做了: '[a-zA-Z \“] * [\(\)\/\”] [a-zA-Z0-9 -_ \(\)\'$%\“\ :\,\; \ _ \ - \ + \/<>#\ \ S] *' 现在我可以标记化是这样的: 'field.type = SMALLINT(5)unsigned' 成 'PATH EQUAL MIXED' – Greggel 2012-04-07 21:31:03

+0

'()'在'[]'里没有什么特别的含义,不需要斜杠转义它。对于许多其他的你可以在这里跳过逃脱,参见http://www.pcre .ORG/pcre.txt – hakre 2012-04-09 07:54:30