2012-04-07 181 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