2016-05-30 7 views
1

単語と一致させることができます。このREGEXPの単語境界[[:<:]]Burger[[:>:]]には、バーガーが入ります。しかし、私はバーガー(チーズ)の項目があり、単語境界[[:<:]]Burger (Cheese)[[:>:]]で見ることができません。単語境界に2つの単語とかっこを入れるにはどうすればいいですか?2つの単語の中に括弧を入れたMySQLの単語境界

+0

私はあなたのおかしいスマイリーは言葉の隣にするためのものであるかわからないが、私のために働くようです。 .. http://www.phpliveregex.com/p/fQN – Andreas

+1

あなたはコードを表示しませんが、カッコは正規表現で特別な意味を持っていますので、リテラルを検索するためにはエスケープする必要があります。 –

+0

@ÁlvaroGonzález - それはちょうどちょうど私がMySQLで使用する 'REGEXP'を追加するコードです。 –

答えて

1

確かに、WHERE ... REGEXP '[[:<:]]Burger (Cheese)[[:>:]]'Burger (Cheese)と一致しません。

最初の問題は、かっこも探していないことです。 ()は正規表現で特別な意味を持ち、グループを定義するために使用されるため、エスケープする必要があります。しかし、正規表現(バックスラッシュ)のエスケープ文字は文字列と同じです。正規表現は文字列の中にあり、バックスラッシュもエスケープする必要があります:\\(

ただし、WHERE ... REGEXP '[[:<:]]Burger \\(Cheese\\)[[:>:]]'はいずれにも一致しません。なぜ2番目の問題になりますか? [[:>:]は、ワード境界が、parenthesis is not a word characterに一致します。

単語文字がalnumクラスの英数字またはアンダースコア(_)です。

単語が最後eで終わるので、あなたは、もはや(Cheese)文字列ので[[:>:]ワード境界を持っていません。

ロジックを再考する必要があります。それはあなたのスペックをスイート場合は、例えば、式の最後に閉じ括弧を追加することができます。

mysql> SELECT * 
    -> FROM (
    -> SELECT 'Burger' AS foo 
    -> UNION ALL SELECT 'Burger (Cheese)' 
    -> UNION ALL SELECT 'Yet Another Burger' 
    -> UNION ALL SELECT 'Burger Extras' 
    -> UNION ALL SELECT 'Coffee' 
    ->) x 
    -> WHERE foo REGEXP '[[:<:]]Burger \\(Cheese([[:>:]]|\\))'; 
+-----------------+ 
| foo    | 
+-----------------+ 
| Burger (Cheese) | 
+-----------------+ 
1 row in set (0.00 sec) 
関連する問題