2012-04-07 24 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; 
} 

"MIXED" "FOO /バー" と一致していない "foobarに" と "STRING" 必要がある "foobarに" と一致してはならない「FOO /バー"。現在、 "foobar"と "foo/bar"は "MIXED"です。

「AND NOT」を1つのパターンに書き込むにはどうすればよいですか?

ありがとうございます。

+0

「ミックスド」=>「[a-zA-Z0-9 -_ \(\)] + \/[a-zA-Z0-9 -_ \(\)] + " – Cougar

+0

、 "MIXED"も "foo()"、 "foo(255)" – Greggel

+0

クーガーは正しい道にあります。あなたが望むのは、「少なくとも1つのスラッシュを含んでいる」という考えを表現することです。 – Kaz

答えて

1

このパターンは、少なくとも一つのスラッシュが含まれている文字、数字、アンダースコア、ハイフンやスラッシュの任意のシーケンスにマッチします:

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

ab/cをマッチングしながら、だから、これはあなたにabcのようなトークンを拒否するかの一般的なアイデアを提供します。これは浮動小数点定数と整数定数を区別するのと非常によく似ています。

おそらくfoo/bar(255) 4などのトークンのような入力をトークン化する必要があります:foo/bar(255)を。

そうしないと、このスラッシュ要件を強制するのが複雑になります。

foo(255/255) 
foo(/) 

かさえ:それはあなたが欲しいどこかにスラッシュ、必ずしもが含まれているという理由だけで

)/- 

素朴な方法はMIXEDは、これらのようなものになることを意味します。

要件を明確にしてください。

+0

ありがとうございます! [[a-zA-Z \ "] * [\(\)\/\"] [a-zA-Z0-9 -_ \(\)\ '$%\」\ 。:\、\; \ _ \ - \ + \/<>#\ \ s]は* 'このような 今私は、トークン化することができます何か?: ' field.type = SMALLINT(5)に unsigned' 'PATH EQUAL MIXED' – Greggel

+0

'() 'スラッシュ・エスケープすることを' [] '、不要の内側には特別な意味を持っていないあなたがそこに脱出をスラッシュ他人の多くは同じですが、HTTPを参照してください。//www.pcreを.org/pcre.txt – hakre

関連する問題