Regexp - поиск начала слов - PullRequest
2 голосов
/ 31 января 2012

Здравствуйте, я создаю сайт и ищу имена по названию. мне нужно регулярное выражение для соответствия в следующих ситуациях ....

Search = Lon

Matches
Londonderry
Greater London

But no match in
Millon

Я пробовал '^Lon', но это не показывает Большой Лондон

Я пробовал просто 'Lon', но это соответствует Миллону,

Я также перепутал границы слов, но не могу заставить его работать правильно. Я уверен, что это просто, но регулярное выражение классически сложно.

Ответы [ 3 ]

8 голосов
/ 31 января 2012

В MySQL вы можете пометить границы слов в Regexp, используя [[:<:]] и [[:>:]].

Так что это должно работать в предложении WHERE:

regexp '[[:<:]]Lon'

Например:

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

MySQL Regexp Manual

Примечание: вы должны принять совет @ gbn относительно проблем с производительностью.

4 голосов
/ 31 января 2012

Вы можете сделать это с помощью LIKE

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

Однако это не будет хорошо масштабироваться из-за начального символа подстановки.Regex имеет ту же проблему.

Вам нужно использовать полнотекстовый поиск со стеблями (в настоящее время только MyISAM для 5.5) для всего масштабируемого.

0 голосов
/ 31 января 2012

Используйте [[:<:]]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 не поддерживает \b и использует вместо него [[:<:]].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...