2012-01-31 9 views
2

こんにちは私はウェブサイトを構築し、場所の名前を名前で検索しています。私は「^Lon」を試してみましたが、このdoesntのショーグレーターロンドン、Regexp - 単語の先頭を検索する

私は単に「Lon」を試してみたが、これが一致しました

Search = Lon 

Matches 
Londonderry 
Greater London 

But no match in 
Millon 

....次のような状況にマッチする正規表現を必要としますmillon、

私はまた、単語の境界をめちゃくちゃにしましたが、正しく動作しません。 これは簡単ですが、regexpは古典的にはトリッキーです。

+0

私はregexpでそれをやり遂げる方法についていくつかの考えを持っていましたが、彼らはあまりにもgenralであり、 "millon"を返すか、 "Greater London"をスキップしますか... –

+0

(^ SEARCH | \ bSEARCH) - doesnt work –

答えて

8

MySQLでは、Regexpで単語境界を[[:<:]][[:>:]]でマークすることができます。

これはあなたのWHERE句で動作するはずです:例えば

regexp '[[:<:]]Lon' 

select * from articles where lower(title) like '[[:<:]]lon' 

MySQL Regexp Manual

注:パフォーマンスの問題に関するGBNのアドバイス@取る必要があります。

+0

ああ、面白い。 RegexBuddyによると、MySQLは単語境界をサポートしていません。私はRegexBuddyの開発者にすぐに通知して、これを修正できるようにします。 –

+0

@Tim私はそれもどちらかを知らなかった:)。手動でこの質問への可能な答えを探して、それを見つけて試してみました。 – kapa

+0

あなたの奇妙な伝説....私は何時間もの間mysql regexpを使って昨晩ぶら下がってしまいました....非常に素晴らしい結果でスズのことを正確には実行します –

4

あなたが好き

WHERE MyCol LIKE 'Lon%' OR MyCol LIKE '% Lon%' 

でこれを行うことができますしかし、これは主要なワイルドカードをうまくスケールしません。正規表現にも同じ問題があります。

ステム(現在のところMyISAM 5.5のみ)を使ってスケーラブルなものを使用する必要があります。full text search

+0

if私はあなたがそれがうまくスケールされていないと言うように、私はむしろこれを使用したくないでしょうテーブルはすでに200,000行です... –

+1

@PhilPoore:私が言ったように、フルテキスト検索を使用する必要があります。もう一つの答えが言うように、REGEXはスケールされません。 – gbn

-2

[[:<:]]Lonを使用してください。 [[:<:]]は、MySQL正規表現でゼロ幅の単語境界に一致します。

> 
var input = ["Million", "Londonderry", "Greater London"]; 
for(var i = 0; i < input.length; i++){ 
    console.log(/[[:<:]]lon/i.test(input[i])); 
} 

> false 
> true 
> true 

EDIT

どうやらMySQL dosn't support \b、代わりに[[:<:]]を使用しています。

+0

これはMySQLの質問です。 – kapa

+0

はMySQLで動作しません、.... :( –

+0

MySQLの正規表現の実装は本当に '\ b'をサポートしていません! –

関連する問題